In general, these verbs used to end in a "g", "k" or "ch" /tʃ/ sound. In some of the modern forms of these words, this sound has changed, such as in "buy".
"fight"~"fought" is not related to the others
You can see that "fight" ends in "ght" in the present as well as the past. It belongs to the large category of English verbs that mark the past tense with a vowel change rather than a dental suffix, like "ride" and "rode". These are called "strong verbs", and the vowel alternation is called "ablaut".
The "t" is the past tense suffix (in words other than "fought")
The "t" added to the past tense in the other words is just a form of the usual dental-consonant past tense suffix, as in "burnt" or "learnt", that is characteristic of "weak verbs".
The "gh" represents historical /x/ from earlier /k/ or /g/
In older forms of English, the "k", "ch", "g" and "y" sounds alternated in some words with the sound /x/, a velar fricative (like the ending sound of "Bach" in German). This sound is produced in the same place in the mouth as the k and g sounds (/k/ and /g/ are velar plosives).
The reason for this alternation is a historic sound change shared by all the Germanic languages that turned either of the velar plosives "g" or "k" into the velar fricative /x/ before another consonant. The "ch" /tʃ/ and "y" /j/ sounds are also involved in this alternation because these sounds developed in English from earlier Germanic /k/ and /g/ respectively in palatalizing contexts.
So, the "gh" represents the sound /x/, which was still pronounced relatively recently in English, for example in Chaucer's time.
Except "caught" never actually had /k/
The word catch was borrowed into English from French with the "ch" sound /tʃ/. It developed a past tense form with "gh" /x/ by analogy with similar verbs.
The "ou" or "au" is due to sound changes that occurred before /x/
Before the sound /x/, nasal consonants such as "n" were regularly dropped, which is why you don't see the "n" of "bring" and "think" in their past tense forms.
A later sound change involving /x/ caused a preceding vowel to develop an offglide. This is why "u" shows up before the "gh". You'll notice that silent "gh" is always preceded by "u" or "i" in the spelling of ordinary Modern English words. (Some of these words also had more complicated vowel changes in the past tense from earlier on in their history.)
Except for "fought", which is just ablaut, the reason why the sequence "-ught" shows up in all these words is basically because
- the "t" is the past tense ending
- the "gh" is a remnant of what became of the last consonant of these verb's present-tense forms
- the "u" reflects the effect the formerly-pronounced "gh" sound had on the preceding vowel.