all repos — site @ b28ff0244440916a9ad5094cb554cb3a6263fa26

source for my site, found at icyphox.sh

build/blog/break-the-ice/index.html (view raw)

  1<!DOCTYPE html>
  2<html lang=en>
  3<link rel="stylesheet" href="/static/style.css" type="text/css">
  4<link rel="stylesheet" href="/static/syntax.css" type="text/css">
  5<link rel="shortcut icon" type="images/x-icon" href="/static/favicon.ico">
  6<meta name="description" content="A blog where security is shilled, aggressively.">
  7<meta name="viewport" content="initial-scale=1">
  8<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
  9<meta content="#021012" name="theme-color">
 10<meta name="HandheldFriendly" content="true">
 11<meta name="twitter:card" content="summary_large_image">
 12<meta name="twitter:site" content="@icyphox">
 13<meta name="twitter:title" content="Anirudh">
 14<meta name="twitter:description" content="A blog where security is shilled, aggressively.">
 15<meta name="twitter:image" content="/static/icyphox.png">
 16<meta property="og:title" content="Anirudh">
 17<meta property="og:type" content="website">
 18<meta property="og:description" content="A blog where security is shilled, aggressively.">
 19<meta property="og:url" content="https://icyphox.sh">
 20<meta property="og:image" content="/static/icyphox.png">
 21<html>
 22  <title>
 23    Anirudh
 24  </title>
 25<script src="//instant.page/1.1.0" type="module" integrity="sha384-EwBObn5QAxP8f09iemwAJljc+sU+eUXeL9vSBw1eNmVarwhKk2F9vBEpaN9rsrtp"></script>
 26<div class="container-text">
 27  <header class="header">
 28     <a href="../">‹ back</a>
 29  </header>
 30<body> 
 31   <div class="content">
 32    <div align="left">
 33      <h1>Break the Ice — Hardware CTF</h1>
 34
 35<h2>SecureLayer7’s hardware CTF at Nullcon ’19, Goa</h2>
 36
 37<p>Earlier this month at Nullcon Goa, we had the chance to attempt a hardware CTF challenge designed by the folks at <a href="https://securelayer7.net">SecureLayer7</a>. We weren’t able to solve it during the period of 2 days that we had (we had talks and parties to be at), but the SL7 guys were kind enough to let us keep the hardware and solve it back at home. Which we did, otherwise this write-up wouldn’t have happened :)</p>
 38
 39<h3>The Hardware</h3>
 40
 41<p>So what’s this cryptic “hardware” I keep mentioning, you wonder? It’s an ESP8266 board — better known as a <strong>NodeMCU</strong>. Here’s a picture.</p>
 42
 43<p><img src="1*cWpvtbXan4LjdJBldelW-g.jpeg" alt="" /></p>
 44
 45<p>Oh, and it came with a pretty OLED display too. So the obvious task at hand was to connect the display to the board. A quick search, and we found an (ever helpful) <a href="https://www.instructables.com/id/Interface-LCD-Using-NodeMCU/">Instructables</a> link with the image down below.</p>
 46
 47<p><img src="1*1avLAYsHDTGU-JS3e6oVrA.jpeg" alt="Not the same display, but it works" /><em>Not the same display, but it works</em></p>
 48
 49<p>Mind you, we struggled quite a bit at this seemingly trivial step, but hey we’re CS students ;)</p>
 50
 51<p>On connecting the device via USB, the board spins up a wireless hotspot called “Device-6”.</p>
 52
 53<p><img src="1*wJ3ZY2EskoSSfvCjliP_jQ.png" alt="" /></p>
 54
 55<p>We tried to connect to this, but it was password protected. We’ll get back to it later.</p>
 56
 57<h3>Flash dump analysis</h3>
 58
 59<p>During one of the many web searches I made with regard to this board, an interesting tool showed up — <a href="https://github.com/espressif/esptool">esptool</a>. A Python utility to communicate with the ESP8266. Wonderful.</p>
 60
 61<p>This tool allows us to do a bunch of operations on the board, but what we’re actually interested in is reading the flash. After looking up the syntax for it, we arrived at:</p>
 62
 63<pre><code>› sudo ./esptool.py -p /dev/ttyUSB0 -b 460800 read_flash 0 0x400000 flash_contents.bin
 64Serial port /dev/ttyUSB0
 65Connecting....
 66Detecting chip type... ESP8266
 67Chip is ESP8266EX
 68Features: WiFi
 69MAC: 84:f3:eb:05:83:1e
 70Uploading stub...
 71Running stub...
 72Stub running...
 73Changing baud rate to 460800
 74Changed.
 754194304 (100 %)
 764194304 (100 %)
 77Read 4194304 bytes at 0x0 in 100.8 seconds (333.0 kbit/s)...
 78Hard resetting via RTS pin...
 79</code></pre>
 80
 81<p>The command is fairly easy to understand, the <code>-p</code> flag denotes the serial port of our device, <code>-b</code> specifies the Baud rate and <code>read_flash</code>, well, reads the flash starting at <code>0</code> till <code>0x400000</code> which is 4MB. 
 82We faced a lot of trouble here, since we kept reading only upto 2MB. Why? Because that’s what the command on the Internet said.</p>
 83
 84<p>Anyway, we have our flash dumped into a file <code>flash_contents.bin</code>.</p>
 85
 86<p>We then decided to run <code>strings</code> on the flash binary and peruse through the thousands of lines it had. Brilliant right? It was, actually. We found a bunch of interesting strings, along with what we guessed to be the wireless hotspot’s password. Spoiler alert: it was.</p>
 87
 88<p><img src="1*5Hc-_XYFw-4_hw3iZpfqkQ.png" alt="The entire dump was 6000+ lines. Did we actually do this D:" /><em>The entire dump was 6000+ lines. Did we actually do this D:</em></p>
 89
 90<p>The go-to utility to (actually) analyze binaries is <code>binwalk</code>. The <code>-e</code> flag extracts the known file types it recognizes within the binary.</p>
 91
 92<pre><code>› binwalk -e flash_contents.bin
 93
 94DECIMAL       HEXADECIMAL     DESCRIPTION
 95--------------------------------------------------------------------------------
 96283960        0x45538         Unix path: /root/.arduino15/packages/esp8266/hardware/esp8266/2.5.0/libraries/ESP8266WiFi/src/include/DataSource.h
 97289387        0x46A6B         HTML document footer
 98291156        0x47154         HTML document header
 99291296        0x471E0         Unix path: /root/.arduino15/packages/esp8266/hardware/esp8266/2.5.0/cores/esp8266/abi.cpp
1003145728       0x300000        Squashfs filesystem, little endian, version 4.0, compression:gzip, size: 139733 bytes, 10 inodes, blocksize: 131072 bytes, created: 2019-02-25 09:14:19
101</code></pre>
102
103<p>We see a squashfs filesystem here. <code>binwalk</code> creates a directory in your current path containing all the files and folders it managed to extract. <code>cd</code>ing into our squashfs folder, we see this:</p>
104
105<p><img src="1*VsEzd8PSYMIUwjBLNFFetA.png" alt=":O" /><em>:O</em></p>
106
107<p>Oooh yes. <code>cat</code>ting the file, we see:</p>
108
109<pre><code>› cat 1/Hidden.txt
110
111######################################### Hints :) ########################################
112
113---telnet server on esp
114
115--Hunt the key to get MQTT creds
116          -- 
117--MQTT box
118
119--Publish the correct message to get ^FLAG^
120
121&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;     PUBLISH..... DISPLAY.... SUBMIT.... :)  &gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;&gt;
122</code></pre>
123
124<p>Looking inside the directory named <code>2</code>, we see another dir <code>3</code> containing a JPEG image and a file telling us about steganography.</p>
125
126<p><img src="1*68k1Y6IoK0XTCPTQRn_0fw.png" alt="" /></p>
127
128<p>And the final directory <code>4</code> had nothing in it but a file with the string <code>flag</code>. Probably to show up as a false positive in the <code>strings</code> output of the flash dump.</p>
129
130<h3>Connecting to “Device-6”</h3>
131
132<p>The first file we came across, containing the hints, mentioned a <code>telnet</code> server running on the board. But how do we reach it? Yep, via the wireless hotspot it exposes — “Device-6”. We authenticated using the PSK we found earlier. 
133On doing so, we’re prompted with a captive portal:</p>
134
135<p><img src="1*XelmAgITUw-9aZc26meUDQ.png" alt="" /></p>
136
137<p>A few things can be done here, configure WiFi on the board, view some info about the board, and reset it. Let’s connect the ESP to our own SSID — like a mobile hotstpot.</p>
138
139<p><img src="1*oQcTNKOFGphPbX50K2pmlg.png" alt="" /></p>
140
141<p>Once that’s done, we should see the “Device-6” SSID disappear, indicating that the board is now connected to our own wireless hotstpot. Another thing we notice is the board lights up, and so does our display!</p>
142
143<p><img src="1*lzKOxEkzJqo8TNI4WckmOg.png" alt="That’s so sad. Alexa play Despacito." /><em>That’s so sad. Alexa play Despacito.</em></p>
144
145<h3>The telnet server</h3>
146
147<p>Once our host machine and the ESP are on the same network, we can <code>nmap</code> our subnet to find our ESP’s IP.</p>
148
149<p><img src="1*lPNqoIFmNfxfabdt4sqYSQ.png" alt="nmap scan report" /><em>nmap scan report</em></p>
150
151<p>We see an <code>http</code> server running, which was obviously the captive portal, and our <code>telnet</code> server on port 23.</p>
152
153<pre><code>› telnet 192.168.43.223
154Trying 192.168.43.223...
155Connected to 192.168.43.223.
156Escape character is '^]'.
157Press Enter &amp; sumbit your key :)
158somekey
159Wrong Key!!!
160</code></pre>
161
162<p>On connecting, we see a prompt asking for a key. And no, ‘sumbit’ was spelt that way ;)</p>
163
164<p>Where could this key possibly be? Well, the only unexplored part of this CTF so far is the image file we came across before. So… steganography.</p>
165
166<p>Although you won’t need it, I downloaded this Docker image for cracking stego — <a href="https://hub.docker.com/r/dominicbreuker/stego-toolkit/">stego-toolkit</a>. We then tossed the image under a bunch of steganography detection and breaking tools, but to no avail.</p>
167
168<p>After a good while <code>steghide</code> gave us something:</p>
169
170<pre><code>› steghide extract -sf 10071856.jpg            
171Enter passphrase:
172</code></pre>
173
174<p>This took <em>really</em> long for us to figure but the password was the name of the image file itself. Urgh. On entering the password, we get a <code>keys.txt</code> file. Here’s what it looked like:</p>
175
176<pre><code>So you guessed the password i think...
177
178Nice!!!
179
180Key is somewhere hidden in this strings ...
181
182XH}&lt;
183TJJ*
184Y#pU
185&lt;g?/N
186gr[i}5
187&gt;+h1
188...snip...
189jlW8B
190yjbm
191M4%'
192tx;ZzL
1933 k]
194wPUf'rc
195)Pz#
1960AwN\
197Lgr:J2
198!H9u
1994bSVy
200(*-C
201nOf2E\
202
203Aaaaaand key is not guessable ....
204
205WARNING:Manual checking for correct key might take you 2 days to complete the challange!!
206</code></pre>
207
208<p>Nearly 600 lines of gibberish. We guessed that one of these strings had to be they key for our <code>telnet</code> session. We tried to automate it, but the <code>telnet</code> session was very unstable. So being the madmen we were, we did it manually. We had all the time in the world. Off we went, copy/pasting the keys in batches of 5… and it worked.</p>
209
210<p><img src="1*vY84DrSpJU1H4c9pSvoB5Q.png" alt="yeet" /><em>yeet</em></p>
211
212<p>As the hint file mentioned, we had to connect to an MQTT instance somewhere and publish something for the flag. So this is what they were talking about.</p>
213
214<p>For those out-of-the-loop, <a href="https://en.wikipedia.org/wiki/MQTT">MQTT</a> is the protocol used in IoT basec client-server interactions, among other things. Go read about it if you want to understand the next bit.</p>
215
216<h3>Capturing the flag</h3>
217
218<p>To interact with the MQTT server, we’ll be using the <a href="https://mosquitto.org">Mosquitto</a> client. We then use the credentials and attempt to “publish” a message:</p>
219
220<pre><code>› mosquitto_pub -h 'm16.cloudmqtt.com' -p 17551  -t 'inTopic/web/test' -u 'hchzbuhr' -P 'Sz4plHnlVnHc' -m '(^.^)'
221</code></pre>
222
223<p><img src="1*W_iVf3vDf4UaelycMbvPvw.png" alt="UwU" /></p>
224
225<p>After messing around with this for quite a bit (as is evident from the screen behind), we tried sending the string ‘flag’ as our message and… <em>dramatic pause</em> we got what you’d expect.</p>
226
227<p><img src="1*sO9vDtGgGjejxklF46gTlg.jpeg" alt="We were 10 days late, mind you" /><em>We were 10 days late, mind you</em></p>
228
229<h3>Conclusion</h3>
230
231<p>This was our first time playing a hardware CTF, and to be honest, there wasn’t <em>much</em> of “hacking” involved — at least by the word’s textbook definition. A lot of guesswork too, which made some parts of it excruciatingly painful to figure out. But all things considered, it was probably the most fun CTF I’ve played yet. Here’s a shoutout to the folks at SL7 for making this CTF <em>and</em> letting us keep the ESP :)</p>
232
233<p>That’s it. The end.</p>
234 
235    </div>
236   </body>
237  </div>
238</html>