0% found this document useful (0 votes)
139 views159 pages

OffensiveCon2018 - The Return of Robin Hood Vs Cisco ASA

The document summarizes a talk given by Cedric Halbronn about finding and exploiting a pre-authentication remote code execution vulnerability in Cisco ASA firewalls. The vulnerability was in the Cisco ASA WebVPN component and could be triggered remotely. Halbronn worked with Cisco to disclose the issue responsibly and protections were added in software updates.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
139 views159 pages

OffensiveCon2018 - The Return of Robin Hood Vs Cisco ASA

The document summarizes a talk given by Cedric Halbronn about finding and exploiting a pre-authentication remote code execution vulnerability in Cisco ASA firewalls. The vulnerability was in the Cisco ASA WebVPN component and could be triggered remotely. Halbronn worked with Cisco to disclose the issue responsibly and protections were added in software updates.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
You are on page 1/ 159

The Return of Robin Hood vs Cisco ASA

OffensiveCon – February 2018


Speaker
• Cedric Halbronn (@saidelike)
• Previously worked at Sogeti ESEC Lab
• Currently in Exploit Development Group (EDG) at NCC Group
• Vulnerability research
• Reverse engineering
• Exploit development
Agenda
• Find a pre-auth 0-day in Cisco ASA firewalls
• Prove Remote Code Execution
• How to protect against 0-day?

https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20180129-asa1
The bug is not in IKEv1

• We exploit a bug in WebVPN


• IKEv1 is a helper to achieve code execution
Context
Cisco ASA firewalls
• Entry point to most enterprises
• ASA != IOS
• ASA = Linux + a single “lina” binary / x86 or x86_64
• IOS = proprietary operating system / MIPS? PowerPC?
Disclosure timeline (1)
• 14 Oct 2017 – Vulnerability in WebVPN and POC reported to Cisco PSIRT
• 18 Oct 2017 – Cisco PSIRT replicates the issue
• 14 Dec 2017 – Cisco tells advisory released on 31/01/2018 (CVE-2018-0101)
• 03 Jan 2018 – NCC discovers patches already exist
Disclosure timeline (2)
• 17 Jan 2018 – NCC tests POC against all branches
• 29 Jan 2018 – Cisco PSIRT releases CVE-2018-0101 advisory
• 5 Feb 2018 – NCC releases Recon Brussels’ slides
• 5 Feb 2018 – Cisco PSIRT updates advisory with new attack vectors new

new
Disclosure timeline (3)
• XX
new

new

https://web.archive.org/web/20180202110047/https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20180129-asa1

https://web.archive.org/web/20180206165532/https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20180129-asa1
SSL VPN
• WebVPN: client-less (browser)
• AnyConnect: client on Windows, OS X, Linux,
Android, iPhone OS
SSL
SSL
IKE VPN
• A.k.a. IPSec
• Typically static point-to-point VPNs
IKEv1 or IKEv2

• Also supported by native Windows client or even AnyConnect client?

Source: https://www.cisco.com/c/en/us/support/docs/security-vpn/webvpn-ssl-vpn/119208-config-asa-00.html#anc17
Previous work
• 2014
• Various WebVPN ASA version leaks (Alec Stuart-Muirk)
• 2016
• CVE-2016-1287: heap overflow in IKE Cisco fragmentation (Exodus Intel)
• CVE-2016-6366: SNMP OID stack overflow (Shadow Brokers)
• 2017
• Cisco ASA series on NCC blog in 8-parts (so far )

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/september/cisco-asa-series-part-one-intro-to-the-cisco-asa/
asatools
• All tools in one repo [1]
• asafw: unpack/repack firmware
• asadbg: debug ASA (hardware + qemu)
• libdlmalloc/libptmalloc: heap allocators (version dependent [2])
• libmempool: Cisco ASA specific heap header
• ret-sync: synchronise IDA and gdb (thanks Alex Gazet )
• idahunt: automate IDA cmdline, hunting for symbols
• Tutorial: configure a Cisco ASA test environment from ground zero [3]

[1] https://github.com/nccgroup/asatools

[2] https://github.com/nccgroup/asafw/blob/master/README.md#mitigation-summary

[3] https://github.com/nccgroup/asatools/blob/master/tutorial.md
asadbg - demo
Cisco ASA releases
END OF LIFE STILL PATCHED RECOMMENDED
Only NX if >= 9.3.3.9 or >= 9.4.3
7.x < 1/2/2016 Only ASLR if >= 9.5.1
ASLR & NX
8.x 8.7.1.18 < 1/5/2016 ptmalloc if >= 9.3.2 if >= 9.5.3
9.0 9.0.4.38 9.0.4.40 < 1/2/2017

9.1 9.1.6.11 9.1.7.9 9.1.7.23 1/1/2016 - *

9.2 9.2.4.5 9.2.4.14 9.2.4.27 1/1/2016 - *

9.3 9.3.3.7 9.3.3.10 < 1/2/2017

9.4 9.4.2.4 9.4.3.8 9.4.4.16 1/1/2016 - *

9.5 9.5.2.2 9.5.3 < 11/4/2017

9.6 9.6.2 9.6.4.3 20/3/2016 - *

9.7 9.7.1.21 4/4/2017 - *

9.8 9.8.2.20 15/5/2017 - *

9.9 9.9.1.2 4/12/2017 - *

XML parser
IKE heap overflow patch SNMP stack overflow patch double-free patch Hypothetical 0-day
(CVE-2016-1287) (CVE-2016-6366) (CVE-2018-0101) vulnerability
10/2/2016 17/8/2016 31/1/2018

2016 2017 2018 2018


Today
Cisco ASA releases
END OF LIFE STILL PATCHED RECOMMENDED

7.x < 1/2/2016 dlmalloc/No ASLR/No NX


8.x < 1/5/2016

9.0 < 1/2/2017

9.1 9.1.7.23 1/1/2016 - *

9.2 9.2.4.27 1/1/2016 - *

9.3 < 1/2/2017

9.4 9.4.4.16 1/1/2016 - *

9.5 < 11/4/2017

9.6 9.6.4.3 20/3/2016 - *

9.7 9.7.1.21 4/4/2017 - *

9.8 9.8.2.20 15/5/2017 - *

9.9.1.2 4/12/2017 - *

XML parser
double-free patch Hypothetical 0-day
(CVE-2018-0101) vulnerability
31/1/2018

2016 2017 2018 2018


Today
The bug is not in IKEv1

IKEv1 for the feng shui

WebVPN/AnyConnect
SSL to trigger
the bug
The bigger the worse?
• What license to buy?
50 IKE sessions
250 IKE sessions

750 IKE sessions


5000 IKE sessions

• An IKE session limits the quantity of data sent as IKE fragments to 0x8000 bytes
• More sessions  more feng shui
• Exploit is more reliable against expensive Cisco hardware and license
• Possible to rob from the rich and give to the poor
• So I named my vulnerabilityexploit: Robin Hood
Source: https://www.cisco.com/c/en/us/td/docs/security/asa/asa97/configuration/vpn/asa-97-vpn-config/vpn-ike.html#ID-2441-00000058
Finding a bug
Sniffing SSL AnyConnect

Burp (or similar)

• First message sent by AnyConnect client


XML
Supported XML tags

Reverse engineering

• Initial sample contains


all supported tags
 Input mutation fuzzing
Fuzzing architecture
• Spray/pray/prey 
Mutated XML packet (radamsa)

Ping (still alive?)


NO  save packet

https://github.com/aoh/radamsa

• Speed: 1 test / few seconds… (no gdb attached)


• Want to start fuzzing before going on leave…
• ASA firewall keeps crashing
Understanding the bug
Triage
• asadbg-assisted
• https://github.com/nccgroup/asadbg

Connect GDB

Fire testcase

Save crash info


Replay with gdb script
# will be called next time it stops. Should be when it crashes
# so we log stuff
define hook-stop
set logging file %CRASH_LOG_FILE%
set logging on
set logging redirect on
set logging overwrite on
sync
bbt
i r
set logging off
set logging redirect off
end

continue

# below will be executed after it breaks because of a crash


# and this allows us to exit gdb
detach
quit
One crash to rule them all
• All the same crash
• Both ASAv 64-bit / ASA 32-bit
The smaller the better
Minimization
• Fits in a tweet

• Actually requires us sending the XML packet twice

AnyConnect Host Scan: https://www.cisco.com/c/en/us/td/docs/security/asa/asa84/configuration/guide/asa_84_cli_config/vpn_hostscan.html


Back to the trace
• What is it?
• Crash in free()
• Invalid heap metadata?
• Heap overflow?
• UAF?
• Double free?
• Other?

• Interesting functions
• *auth_process_client*
• *FreeParser*
2 days reversing later…
• aggregateAuthParseBuf
• Receive the XML / initialize the libexpat parser
• Cisco-specific callbacks registered
• aggregateAuthStartHandler: called when XML tag opened
• aggregateAuthDataHandler: called when XML data parsed
• aggregateAuthEndHandler: called when XML tag closed
Data handler
Data handler
XML 1
Data handler
XML 1

Allocated chunk
Data handler

XML tag data


copied in chunk

1
Data handler

Chunk is freed

1
Data handler

XML tag data dangling


pointer retained by Cisco
callback

1
Data handler

XML tag data dangling


pointer retained by Cisco
callback

1
Data handler
XML 2

XML tag data dangling


pointer retained by Cisco
callback

1
Data handler

XML tag data


appended in free chunk

1 2
Data handler

XML tag data


appended in free chunk

1 2
Data handler

Chunk is freed (double-free)

1 2
Data handler
• First packet with <host-scan-reply> tag
• Allocate heap buffer for data, copy data, free it (but dangling pointer)
• Second packet with <host-scan-reply> tag
• No reallocation, copy data, free it
• Tags’ data copied and appended in the same chunk
 double-free vulnerability on 0x2040-byte chunk
assert() due to invalid metadata
• Inline metadata/header for heap chunks
Hchunk H chunk H Free chunk Hchunk
prev_foot = 0x8180d4d0
head = 0x1d0 (CINUSE|PINUSE)
mh_magic = 0xa11c0123 Allocated
mh_len = 0x1a4 chunk header
mh_refcount = 0x0
mh_unused = 0x0
mh_fd_link = 0xacb85b30
mh_bk_link = 0xa8800604
allocator_pc = 0x86816b3
free_pc = 0x868161d
Same offset
prev_foot = 0x8180d4d0
head = 0x30 (PINUSE)
fd = 0xac825ab8
bk = 0xa880005c
mh_refcount = 0xf3ee0123 Free chunk
mh_unused = 0x0
mh_fd_link = 0x0 header
mh_bk_link = 0x0
allocator_pc = 0x0
free_pc = 0x0

• Hence why our fuzzer caught it!


Exploiting the bug like RobinHood
Objective: mirror write
• Allocated chunks hold pointers to doubly-linked list
prev_foot = 0x8180d4d0
head = 0x1d0 (CINUSE|PINUSE)
mh_magic = 0xa11c0123
mh_len = 0x1a4
mh_refcount = 0x0
mh_unused = 0x0
mh_fd_link = 0xacb85b30
mh_bk_link = 0xa8800604
allocator_pc = 0x86816b3
free_pc = 0x868161d

• Target Cisco mempool alloc lists to get a mirror write


• No safe unlinking on Cisco metadata for allocated chunks (all ASA versions)
• Even if dlmalloc or ptmalloc had safe unlinking for free chunks
• Mirror write: unlinking an element from a doubly-linked list will trigger
two write operations
• One operation is the useful one, the other is a side effect
• Constraint: both need to be writable addresses
• Was already abused in 2016 by Exodus Intel
Exploit strategy
• Hole creation primitive with IKEv1
• Allocate XML data in hole / freed at the end
• Allocate fragment in same hole
• Repeatable free primitive with XML
• Allocate fragment with larger size in same hole
• Trigger reassembly  corrupt linked list pointers
• Trigger mirror writes  corrupt a function pointer
• Send IKE init packet to trigger RCE
Leverage IKE reassembly

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n

Seqno=1

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n+n

Seqno=1 Seqno=2

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n+n+p

Seqno=1 Seqno=2 Seqno=3

LastFrag=1

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n+n+p

Seqno=1 Seqno=2 Seqno=3

LastFrag=1

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n+n+p

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n+n+p

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
1

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n+n+p

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
1 2

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n+n+p

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
1 2 3

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment

https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Leverage IKE reassembly
Reassembled packet length: n+n+p

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
1 2 3

• Leverage techniques learnt from CVE-2016-1287


• IKEv1 fragmentation is a reliable feng shui mechanism
• Reassembled packet length updated when queueing a fragment
• Fragment length not re-checked during reassembly
https://www.nccgroup.trust/uk/about-us/newsroom-and-events/blogs/2017/november/cisco-asa-series-part-eight-exploiting-the-cve-2016-1287-heap-
overflow-over-ikev1/
Max data per IKE session
• XML buffer used by repeatable free primitive is a 0x2000 chunk
• For a given IKEv1 session, accumulated length needs < 0x8000

• With 0x2000-byte chunk granularity


• Can only have up to 4 frags per IKEv1 session (4*0x2000 = 0x8000)
• Also limits how many mirror writes we get…
Max number of mirror writes
• Overlapping chunk’s size dictates max number of mirror writes
• With 0x2040 chunks, it means maximum 2 mirror writes (see above)
0x2040 0x4080 0x2040 0x2040

feng overlapping target1 target2


0x6120

• Solution is to change the granularity and use 0x810 chunks


0x810 0x810 0x2850 0x810 0x810 0x810

overlapping
0x810 0x810 0x48f0 0x810 0x810
Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole
Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

feng
Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

feng feng
Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

SeqNo=1

feng feng sess2


Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

SeqNo=1

feng feng sess2 feng


Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

SeqNo=1

feng feng sess2 feng feng


Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

SeqNo=1
SeqNo=2

feng feng sess2 feng feng sess2


LastFrag=1
Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

reass

SeqNo=1
SeqNo=2

feng feng sess2 feng feng sess2


LastFrag=1
Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

SeqNo=1

reass
sess2

SeqNo=2

feng feng feng feng sess2


LastFrag=1
Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

SeqNo=1 SeqNo=2

reass
sess2 sess2
LastFrag=1

feng feng feng feng


Primitive 1 - Hole creation with IKEv1
• Session 1 (feng): fill holes
• Session 2: only two fragments
• Frag 1: future hole
• Frag 2: trigger reassembly, hence creating hole

feng feng feng feng


Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70

sess1

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70 0x70

sess1 sess2

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70 0x70 0x70

sess1 sess2 sess1

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70 0x70 0x70 0x70

sess1 sess2 sess1 sess2

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70 0x70 0x70 0x70 0x70

sess1 sess2 sess1 sess2 sess1

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70 0x70 0x70 0x70 0x70 0x70

sess1 sess2 sess1 sess2 sess1 sess2

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70 0x70 0x70 0x70 0x70 0x70 0x70

sess1 sess2 sess1 sess2 sess1 sess2 sess1

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70 0x70 0x70 0x70 0x70 0x70 0x70
sess2
sess1 sess2 sess1 sess2 sess1 sess2 sess1
LastFrag=1

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Small holes creation
• We want some adjacency
frag frag frag

• But small structures allocated will mess up with our feng shui
• When frags received, structures < 0x70 to track frags
frag frag frag

• Solution: send small fragments in two IKEv1 sessions and reassemble one of them
• Create 0x70-byte
0x70 0x70 0x70 0x70 0x70 0x70 0x70

sess1 sess1 sess1 sess1

• Similarly, when WebVPN packet received, structures < 0x400 so create 0x400 holes
 Working with 0x800-byte chunks will give us some adjacency
Primitive 2 – Repeatable free with XML
• This is a really good primitive
• XML data allocated for first packet, then freed
• Allocate IKEv1 fragment in same hole
• Free IKEv1 fragment using the repeatable free primitive
• Allocate another IKEv1 fragment in same hole
 Interesting confusion state

feng feng feng feng


Primitive 2 – Repeatable free with XML
• This is a really good primitive
• XML data allocated for first packet, then freed
• Allocate IKEv1 fragment in same hole
• Free IKEv1 fragment using the repeatable free primitive
• Allocate another IKEv1 fragment in same hole
 Interesting confusion state

XML tag
feng feng data feng feng
Primitive 2 – Repeatable free with XML
• This is a really good primitive
• XML data allocated for first packet, then freed
• Allocate IKEv1 fragment in same hole
• Free IKEv1 fragment using the repeatable free primitive
• Allocate another IKEv1 fragment in same hole
 Interesting confusion state
XML tag data
dangling
pointer

feng feng feng feng


Primitive 2 – Repeatable free with XML
• This is a really good primitive
• XML data allocated for first packet, then freed
• Allocate IKEv1 fragment in same hole
• Free IKEv1 fragment using the repeatable free primitive
• Allocate another IKEv1 fragment in same hole
 Interesting confusion state
XML tag data
dangling
pointer

feng feng S1 F feng feng


Primitive 2 – Repeatable free with XML
• This is a really good primitive
• XML data allocated for first packet, then freed
• Allocate IKEv1 fragment in same hole
• Free IKEv1 fragment using the repeatable free primitive
• Allocate another IKEv1 fragment in same hole
 Interesting confusion state
XML tag data
dangling session frag
pointer

feng feng S1 F feng feng


Primitive 2 – Repeatable free with XML
• This is a really good primitive
• XML data allocated for first packet, then freed
• Allocate IKEv1 fragment in same hole
• Free IKEv1 fragment using the repeatable free primitive
• Allocate another IKEv1 fragment in same hole
 Interesting confusion state
XML tag data
dangling session frag
pointer

XML
feng feng S1 F feng feng packet 2
Primitive 2 – Repeatable free with XML
• This is a really good primitive
• XML data allocated for first packet, then freed
• Allocate IKEv1 fragment in same hole
• Free IKEv1 fragment using the repeatable free primitive
• Allocate another IKEv1 fragment in same hole
 Interesting confusion state
XML tag data
dangling session frag
pointer

feng feng feng feng


Primitive 2 – Repeatable free with XML
• This is a really good primitive
• XML data allocated for first packet, then freed
• Allocate IKEv1 fragment in same hole
• Free IKEv1 fragment using the repeatable free primitive
• Allocate another IKEv1 fragment in same hole
 Interesting confusion state
XML tag data “confused”
dangling session frag replacement frag
pointer

feng feng S2 feng feng


Primitive 3 – Confused fragment primitive
• Change the size of already queued fragment S1
(gdb) dlchunk 0xad854108 -c 2 -p 0x44
0xad854108 M sz:0x02030 fl:CP alloc_pc:ike_receiver_process_data+0x3ed 0x6262 bb
0xad856138 F sz:0x00010 fl:-P 0x0000 hex(07c8)
(gdb) python print(frag_payload(0xad854108+0x28+0x1c)) “confused”
struct frag_payload @ 0xad85414c {
next_payload = 0x0 session frag replacement frag
critical_bit = 0x0
payload_length = 0x1fe6
id = 0x10 feng S1 F feng
seqno = 0x2
last_frag = 0x1
S2
(gdb) dlchunk 0xad854108 -c 1 -p 0x44
0xad854108 M sz:0x02040 fl:CP alloc_pc:ike_receiver_process_data+0x3ed 0x6666 ff
(gdb) python print(frag_payload(0xad854108+0x28+0x1c))
struct frag_payload @ 0xad85414c {
next_payload = 0x0
critical_bit = 0x0
payload_length = 0x1ff2
id = 0x20
seqno = 0x2
last_frag = 0x1
• Trick: leave a small free chunk adjacent to S1
• Confusion state: IKEv1 session frag S1 has an increased payload_length field
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n

Seqno=1
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n +p

Seqno=1 Seqno=3

LastFrag=1
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n +p

+18

Seqno=1 Seqno=3

LastFrag=1
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n+n+p

+18

Seqno=1 Seqno=2 Seqno=3

LastFrag=1
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n+n+p

+18

Seqno=1 Seqno=2 Seqno=3

LastFrag=1
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n+n+p

+18 N

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n+n+p

+18 N

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
1
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n+n+p

+18 N

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
1 2
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n+n+p

+18 N

Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
1 2 3
Primitive 4 - Overflow with IKEv1
• Use a trick similar to CVE-2016-1287
• Abuse increased size of confused fragment created by previous primitive
• Allows overflow of adjacent memory
Reassembled packet length: n+n+p

+18 N
Heap overflow
Seqno=1 Seqno=2 Seqno=3 Reassembled packet

LastFrag=1
1 2 3

N+18
Limited overflow (18-byte on 32-bit)

[1]
[2]

[3]

[4]

[5]
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions

Adjacent on the heap



Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators

Adjacent on the heap


0x810

I Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators

Adjacent on the heap


0x810 0x810

I I Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810

I I J
Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810

I I J J Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810

I I J J J
Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J
Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K K Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K K K Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K K K L
Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K K K L M
Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K K K L M N
Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K K K L M N O
Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K K K L M N O P
Somewhere
else on the heap
Exploit in a (coco)nut shell
(gdb) dlchunk 0xacd78090 -c 17 -p 0x44
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 JJ
0xacd790b0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 JJ
• Blue: separators
0xacd798c0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 JJ • Green: hole creation
0xacd7a0d0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0004 JJ
0xacd7a8e0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 II
• Orange: targets for mirror writes
0xacd7b0f0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 hex(0000)
0xacd7b900 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 hex(0000)
0xacd7c110 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 hex(0000)
0xacd7c920 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0004 hex(0000)
0xacd7d130 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0005 hex(0000)
0xacd7d940 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 LL
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

Adjacent on the heap


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I J J J J I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes

Adjacent on the heap J


0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810
… LastFrag=1

I I J J J J I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
malloc: 0xacd809a0 realsz 0x1f60, reqsz 0x1f34 - reassembled packet
(gdb) dlchunk 0xacd78090 -c 14 -p 0x44 Robin Hood uses IKEv1 sessions
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II
0xacd788a0 F sz:0x02040 fl:-P free_pc:0x0868d28d,- 0x4a4a JJ
• Blue: separators
0xacd7a8e0 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0002 II • Green: hole creation
0xacd7b0f0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 hex(0000)
0xacd7b900 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 hex(0000)
• Orange: targets for mirror writes
0xacd7c110 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 hex(0000)
0xacd7c920 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0004 hex(0000)
0xacd7d130 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0005 hex(0000)
0xacd7d940 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 LL
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

Adjacent on the heap


0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes

XML
Adjacent on the heap
packet 1
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
previous xml_tags[13].alloc = NULL
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 M sz:0x02030 fl:CP alloc_pc:0x0807f8c4,- xml_tags[13].alloc
0xacd7a8d0 F sz:0x00010 fl:-P
• Blue: separators
0xacd7a8e0 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0002 II • Green: hole creation
0xacd7b0f0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 hex(0000)
0xacd7b900 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 hex(0000)
• Orange: targets for mirror writes
0xacd7c110 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 hex(0000)
0xacd7c920 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0004 hex(0000)
0xacd7d130 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0005 hex(0000)
0xacd7d940 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 LL
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

Adjacent on the heap


0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I XML tag I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
(gdb) dlchunk 0xacd78090 -c 14 -p 0x44
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 F sz:0x02040 fl:-P free_pc:0x0994a2bf,
0xacd7a8e0 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0002 II
• Blue: separators
0xacd7b0f0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 hex(0000) • Green: hole creation
0xacd7b900 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 hex(0000)
0xacd7c110 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 hex(0000)
• Orange: targets for mirror writes
0xacd7c920 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0004 hex(0000)
0xacd7d130 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0005 hex(0000)
0xacd7d940 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 LL
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

XML tag data


dangling pointer
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 M sz:0x02030 fl:CP alloc_pc:0x0807f8c4,- 0x0002 bb
0xacd7a8d0 F sz:0x00010 fl:-P
• Blue: separators
0xacd7a8e0 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0002 II • Green: hole creation
0xacd7b0f0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 hex(0000)
0xacd7b900 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 hex(0000)
• Orange: targets for mirror writes
0xacd7c110 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 hex(0000) • Pink: confused session reassembled
0xacd7c920 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0004 hex(0000)
0xacd7d130 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0005 hex(0000)
0xacd7d940 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 LL
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

XML tag data


dangling pointer
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I S1 I K K K K K L M N O P I Somewhere
0x2030 0x10 else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled

XML tag data


dangling pointer session frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I S1 I K K K K K L M N O P I Somewhere
0x2030 0x10 else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled

XML tag data


dangling pointer session frag XML
Adjacent on the heap
packet 2
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I S1 I K K K K K L M N O P I Somewhere
0x2030 0x10 else on the heap
Exploit in a (coco)nut shell
(gdb) dlchunk 0xacd78090 -c 14 -p 0x44
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 F sz:0x02040 fl:-P free_pc:0x0994a2bf,
0xacd7a8e0 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0002 II
• Blue: separators
0xacd7b0f0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 hex(0000) • Green: hole creation
0xacd7b900 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 hex(0000)
0xacd7c110 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 hex(0000)
• Orange: targets for mirror writes
0xacd7c920 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0004 hex(0000) • Pink: confused session reassembled
0xacd7d130 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0005 hex(0000)
0xacd7d940 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 LL
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

XML tag data


dangling pointer session frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 M sz:0x02040 fl:CP alloc_pc:0x0869460d,- 0x6666 ff
0xacd7a8e0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 II
• Blue: separators
0xacd7b0f0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 hex(0000) • Green: hole creation
0xacd7b900 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 hex(0000)
0xacd7c110 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 hex(0000)
• Orange: targets for mirror writes
0xacd7c920 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0004 hex(0000) • Pink: confused session reassembled
0xacd7d130 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0005 hex(0000)
0xacd7d940 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 LL
• Purple: replacement frag
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

XML tag data


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I S2 I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
// initial b fragment
(gdb) python print(frag_payload(0xacd788a0+0x28+0x1c)) Robin Hood uses IKEv1 sessions
struct frag_payload @ 0xacd788e4 {
next_payload = 0x0 • Blue: separators
critical_bit = 0x0 • Green: hole creation
payload_length = 0x1fe6
id = 0x10 • Orange: targets for mirror writes
seqno = 0x2 • Pink: confused session reassembled
last_frag = 0x1
• Purple: replacement frag
// replacement f fragment
(gdb) python print(frag_payload(0xacd788a0+0x28+0x1c))
struct frag_payload @ 0xacd788e4 {
next_payload = 0x0
critical_bit = 0x0
payload_length = 0x1ff2
id = 0x20
seqno = 0x2
last_frag = 0x1
XML tag data “confused”
dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810

I I S1 I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap K
0x810 0x810 0x2040 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810 0x810
… LastFrag=1

I I S1 I K K K K K L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
(gdb) dlchunk 0xacd78090 -c 20 -p 0x44
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 M sz:0x02040 fl:CP alloc_pc:0x0869460d,- 0x6666 ff
0xacd7a8e0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 II
• Blue: separators
0xacd7b0f0 F sz:0x02850 fl:-P free_pc:0x0868d28d, • Green: hole creation
0xacd7d940 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0000 LL
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
• Orange: targets for mirror writes
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN • Pink: confused session reassembled
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
• Purple: replacement frag
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I S1 I L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap S1
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 … LastFrag=1

I I S1 I L M N O P I Somewhere
else on the heap
Exploit in a (coco)nut shell
malloc: 0xacd7b0f0 realsz 0x2820, reqsz 0x27f4 - reassembled packet
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 M sz:0x02040 fl:CP alloc_pc:0x0869460d,- 0x6666 ff
0xacd7a8e0 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0002 II
• Blue: separators
0xacd7b0f0 M sz:0x02820 fl:CP alloc_pc:0x0868d323,- • Green: hole creation
0xacd7d910 F sz:0x00030 fl:-P free_pc:0x00000000,-
0xacd7d940 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0000 LL
• Orange: targets for mirror writes
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM • Pink: confused session reassembled
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
• Purple: replacement frag
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Reass pkt L M N O P I Somewhere
0x2820 0x30 else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Reass pkt L M N O P I Somewhere
0x2820 0x20d0 else on the heap
Exploit in a (coco)nut shell
(gdb) dlchunk 0xacd78090 -c 20 -p 0x44
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 F sz:0x02040 fl:-P free_pc:0x0868d28d,- 0x6666 ff
0xacd7a8e0 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0002 II
• Blue: separators
0xacd7b0f0 F sz:0x048f0 fl:-P free_pc:0x08664fc0,- • Green: hole creation
0xacd7f9e0 M sz:0x007b0 fl:C- alloc_pc:0x50505050,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II
• Orange: targets for mirror writes
(gdb) dlchunk 0xacd7d940 -c 20 -p 0x44 • Pink: confused session reassembled
0xacd7d940 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0000 LL
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 MM
• Purple: replacement frag
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 NN
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0000 OO
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I L M N O P I Somewhere
0x48f0 else on the heap
Exploit in a (coco)nut shell
(gdb) dlchunk 0xacd78090 -c 6 -p 0x44
0xacd78090 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0001 II Robin Hood uses IKEv1 sessions
0xacd788a0 F sz:0x02040 fl:-P free_pc:0x0868d28d,- 0x6666 ff
0xacd7a8e0 M sz:0x00810 fl:C- alloc_pc:0x0869460d,- 0x0002 II
• Blue: separators
0xacd7b0f0 M sz:0x048f0 fl:CP alloc_pc:0x0869460d,- 0x5151 QQ • Green: hole creation
0xacd7f9e0 M sz:0x007b0 fl:CP alloc_pc:0x50505050,- 0x5050 PP
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II
• Orange: targets for mirror writes
(gdb) dlchunk 0xacd7d940 -c 20 -p 0x44 • Pink: confused session reassembled
0xacd7d940 M sz:0x00810 fl:CP alloc_pc:0x00004443,- 0x5252 RR
0xacd7e150 M sz:0x00810 fl:CP alloc_pc:0x00004443,- 0x5353 SS
• Purple: replacement frag
0xacd7e960 M sz:0x00810 fl:CP alloc_pc:0x00004443,- 0x5454 TT • Grey: overlapping packet
0xacd7f170 M sz:0x00810 fl:CP alloc_pc:0x00004443,- 0x5555 UU
0xacd7f980 M sz:0x00810 fl:CP alloc_pc:0x00004443,- 0x5656 VV
0xacd80190 M sz:0x00810 fl:CP alloc_pc:0x0869460d,- 0x0003 II

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping
L M N O P I Somewhere
0x48f0 else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping L M N O P I Somewhere
0x48f0 else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap P
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 … LastFrag=1

I I I Overlapping L M N O P I Somewhere
0x48f0 else on the heap
Exploit in a (coco)nut shell
.bss:0xb2b7480 ch_is_validating = non-zero (Checkheaps disabled)
Robin Hood uses IKEv1 sessions
struct malloc_chunk @ 0xacd7f980 {
prev_foot = 0x8180d4d0 • Blue: separators
size = 0x810 (CINUSE|PINUSE) • Green: hole creation
struct mp_header @ 0xacd7f988 {
mh_magic = 0xa11c0123 • Orange: targets for mirror writes
mh_len = 0x7e4 • Pink: confused session reassembled
mh_refcount = 0x0
mh_unused = 0x0 • Purple: replacement frag
mh_fd_link = 0xc2e00000 (-) • Grey: overlapping packet
mh_bk_link = 0xb2b7470 (-)
alloc_pc = 0x4443 (-)
free_pc = 0x4241c448 (-)

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping L M N O I Somewhere
0x48f0  else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap O
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 … LastFrag=1

I I I Overlapping L M N O I Somewhere
0x48f0  else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping L M N I Somewhere
0x48f0   else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap N
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 … LastFrag=1

I I I Overlapping L M N I Somewhere
0x48f0   else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping L M I Somewhere
0x48f0    else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap M
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 … LastFrag=1

I I I Overlapping L M I Somewhere
0x48f0    else on the heap
Exploit in a (coco)nut shell
(gdb) x /3wx 0xc2831200
0xc2831200: 0xc2831204 0xc283128b 0xc2e2ff6a Robin Hood uses IKEv1 sessions
(gdb) x /3i 0xc2831204 • Blue: separators
0xc2831204: mov edx,DWORD PTR [edx]
0xc2831206: add edx,0x6a • Green: hole creation
0xc2831209: jmp edx • Orange: targets for mirror writes
struct malloc_chunk @ 0xacd7e150 { • Pink: confused session reassembled
prev_foot = 0x8180d4d0
size = 0x810 (CINUSE|PINUSE) • Purple: replacement frag
struct mp_header @ 0xacd7e158 { • Grey: overlapping packet
mh_magic = 0xa11c0123
mh_len = 0x7e4
mh_refcount = 0x0
mh_unused = 0x0
mh_fd_link = 0xc2831204 (-)
mh_bk_link = 0xc28311f0 (-)
alloc_pc = 0x4443 (-)
free_pc = 0x4241c448 (-)
XML tag data “confused”
dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping L I Somewhere
0x48f0     else on the heap
Exploit in a (coco)nut shell
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
• Pink: confused session reassembled
• Purple: replacement frag
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap L
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 … LastFrag=1

I I I Overlapping L I Somewhere
0x48f0     else on the heap
Exploit in a (coco)nut shell
.data:0xa46d330 IKEMM_BuildMainModeMsg2_ptr  trampoline
Robin Hood uses IKEv1 sessions
struct malloc_chunk @ 0xacd7d940 {
prev_foot = 0x8180d4d0 • Blue: separators
size = 0x810 (CINUSE|PINUSE) • Green: hole creation
struct mp_header @ 0xacd7d948 {
mh_magic = 0xa11c0123 • Orange: targets for mirror writes
mh_len = 0x7e4 • Pink: confused session reassembled
mh_refcount = 0x0
mh_unused = 0x0 • Purple: replacement frag
mh_fd_link = 0xc2831200 (-) • Grey: overlapping packet
mh_bk_link = 0xa46d320 (-)
alloc_pc = 0x4443 (-)
free_pc = 0x4241c448 (-)

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping I Somewhere
0x48f0      else on the heap
Exploit in a (coco)nut shell
.data:0xa46d330 IKEMM_BuildMainModeMsg2_ptr  trampoline
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
(gdb) x /3i 0xc2831204
0xc2831204: mov edx,DWORD PTR [edx] • Pink: confused session reassembled
0xc2831206: add edx,0x6a • Purple: replacement frag
0xc2831209: jmp edx
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap IKE init
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping I Somewhere
0x48f0      else on the heap
Exploit in a (coco)nut shell
.data:0xa46d330 IKEMM_BuildMainModeMsg2_ptr  trampoline
IKE init Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
(gdb) x /3i 0xc2831204
0xc2831204: mov edx,DWORD PTR [edx] • Pink: confused session reassembled
0xc2831206: add edx,0x6a • Purple: replacement frag
0xc2831209: jmp edx
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping I Somewhere
0x48f0      else on the heap
Exploit in a (coco)nut shell
.data:0xa46d330 IKEMM_BuildMainModeMsg2_ptr  trampoline
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
(gdb) x /3i 0xc2831204
0xc2831204: mov edx,DWORD PTR [edx] • Pink: confused session reassembled
0xc2831206:
IKE init add edx,0x6a • Purple: replacement frag
0xc2831209: jmp edx
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping I Somewhere
0x48f0      else on the heap
Exploit in a (coco)nut shell
.data:0xa46d330 IKEMM_BuildMainModeMsg2_ptr  trampoline
Robin Hood uses IKEv1 sessions
• Blue: separators
• Green: hole creation
• Orange: targets for mirror writes
(gdb) x /3i 0xc2831204
0xc2831204: mov edx,DWORD PTR [edx] • Pink: confused session reassembled
0xc2831206: add edx,0x6a • Purple: replacement frag
0xc2831209: jmp edx
• Grey: overlapping packet

XML tag data “confused”


dangling pointer session frag replacement frag
Adjacent on the heap
0x810 0x810 0x2040 0x810 0x2850 0x810 0x810 0x810 0x810 0x810 0x810 …
I I I Overlapping I Somewhere
0x48f0      else on the heap
Exploit - demo
Other approaches
1. Having one frag / the reassembled packet in the same chunk
• But when reassembly fails, results in another double-free 
2. XML data is appended with strncat()
• Overwrite first fragment to change its length?
• Need a strncat()-friendly character
• Can’t use very large length due to reassembly incomplete check
• But still need to allocate something else anyway to avoid double-free
• Took 2 weeks to build an exploit
• Prior to that, took months to write asatools [1]

[1] https://github.com/nccgroup/asatools
Conclusions
Lessons learnt
• Fuzzing just the tags list is enough to find the bug
• Radamsa was useless in our case
• Working exploit on 32-bit (no ASLR/NX)
• Note: some old 64-bit don’t have ASLR either [1] 
• 7-year old bug? – AnyConnect Host Scan available since 2011
• Cisco-specific handlers, not libexpat
• IKEv1 frag primitive to overflow memory / create mirror writes
• Confusion state: one chunk used for two different IKEv1 packets
• IKEv1 feng shui useful for any heap-based bug
[1] https://github.com/nccgroup/asafw/blob/master/README.md#mitigation-summary
Next steps
• WebVPN/AnyConnect exploit only (not relying on IKEv1)?
• Exploiting other attack vectors (e.g. IKEv2)?
• Turn a repeatable free into a memory revelation primitive?
• Bypass ASLR on recent 64-bit?
• Something like BENIGNCERTAIN on Cisco IOS [1]?
• XML grammar-based fuzzer to find new 0-day?
• Support for tags, attributes, etc.

[1] https://tools.cisco.com/security/center/content/CiscoSecurityAdvisory/cisco-sa-20160916-ikev1
Protect against 0-day vulnerabilities?
Questions
• Special thanks to
• My colleague Aaron Adams (@FidgetingBits) for developing asatools with
me and for the help on exploiting this 
• Cisco PSIRT for handling this
• Many people from REcon for their feedbacks
• Contact
• @saidelike
• cedric(dot)halbronn(at)nccgroup(dot)trust

You might also like