<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[Ian C A Ling]]></title><description><![CDATA[Ian C A Ling]]></description><link>https://blog.iancaling.com/</link><image><url>https://blog.iancaling.com/favicon.png</url><title>Ian C A Ling</title><link>https://blog.iancaling.com/</link></image><generator>Ghost 4.20</generator><lastBuildDate>Sun, 24 Nov 2024 06:16:18 GMT</lastBuildDate><atom:link href="https://blog.iancaling.com/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Repairing the dishwasher]]></title><description><![CDATA[<p>We have an old Kitchen Aid KUDS03CTSS3 dishwasher. The manufacturing dates on the parts inside range anywhere from 2008-2011, so it&apos;s getting pretty old &#x2013; somewhere between 12 and 15 years as of 2023.</p><p>We&apos;ve had no issues with it up &apos;til a couple weeks</p>]]></description><link>https://blog.iancaling.com/repairing-the-dishwasher/</link><guid isPermaLink="false">64530d1858c16701b9586784</guid><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Thu, 04 May 2023 09:31:27 GMT</pubDate><content:encoded><![CDATA[<p>We have an old Kitchen Aid KUDS03CTSS3 dishwasher. The manufacturing dates on the parts inside range anywhere from 2008-2011, so it&apos;s getting pretty old &#x2013; somewhere between 12 and 15 years as of 2023.</p><p>We&apos;ve had no issues with it up &apos;til a couple weeks ago, when we noticed that the door on the detergent dispenser no longer opened automatically during the wash cycle. </p><p>The detergent dispenser looks like this:</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2023/05/image_1024.jpg" class="kg-image" alt="An image of the detergent dispenser on the dishwasher" loading="lazy" width="1000" height="1000" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/image_1024.jpg 600w, https://blog.iancaling.com/content/images/2023/05/image_1024.jpg 1000w" sizes="(min-width: 720px) 720px"></figure><p>To run a load, you put some soap <a href="https://www.youtube.com/watch?v=_rBO8neWw04">into both compartments</a> and close the lid. Soap in the pre-wash compartment trickles out through the plastic grate while soap in the main wash area remains sealed in. At some point &#x2013; about 15-20 minutes later in our dishwasher &#x2013; the lid swings open, releasing the soap from the main wash compartment. Or, at least, it used to.</p><p>The lid could still be operated manually; I could close it and it would latch, and then I could unlatch it using the little grey latch and the spring in the hinge would force it to fling open. Since there didn&apos;t appear to be any mechanical issues with the door, this pointed to an issue with the electronics controlling the dispenser.</p><p>Upon opening up the main body of the dishwasher, one issue became immediately apparent.</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230422_120105-1.jpg" class="kg-image" alt loading="lazy" width="2000" height="2664" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230422_120105-1.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230422_120105-1.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230422_120105-1.jpg 1600w, https://blog.iancaling.com/content/images/size/w2400/2023/05/IMG_20230422_120105-1.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230422_120045--2-.jpg" class="kg-image" alt loading="lazy" width="2000" height="1688" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230422_120045--2-.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230422_120045--2-.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230422_120045--2-.jpg 1600w, https://blog.iancaling.com/content/images/size/w2400/2023/05/IMG_20230422_120045--2-.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><p>This mechanism is the actuator that automatically releases the latch on the soap dispenser. The burnt out white thing is a normally closed solenoid. When turned on, the solenoid generates a magnetic field, which pulls on a small metal rod (visible in the center of the spring in the second photo), compressing the spring and pulling that plastic hook arm thing in the counter-clockwise direction. That hook is connected to the latch on the front of the soap dispenser, so when this hook moves, it unlatches the lid. When the solenoid is turned off, the magnetic field goes away, allowing the spring to expand so that the soap dispenser is able to latch again next time you want to run the dishwasher.</p><p>In case that orange-brown color wasn&apos;t enough of a clue that the solenoid is dead, you can also measure the electrical resistance using a multimeter in ohms mode. Based on my research, it seems like 200-400 ohms is a common range for a working detergent dispenser solenoid. My multimeter wouldn&apos;t give me a resistance value at all, meaning something inside the solenoid had been destroyed so there was no longer electrical continuity. It was definitely broken.</p><p>I needed a replacement solenoid, but how could I find one in exactly the same size? There&apos;s some text on the front of the solenoid:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230422_120258--2-.jpg" class="kg-image" alt loading="lazy" width="1604" height="989" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230422_120258--2-.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230422_120258--2-.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230422_120258--2-.jpg 1600w, https://blog.iancaling.com/content/images/2023/05/IMG_20230422_120258--2-.jpg 1604w" sizes="(min-width: 720px) 720px"><figcaption>120V 60HZ, 91413.03 2801811</figcaption></figure><p>Searching for the <code>91413.03</code> part ended up being the key. I&apos;m not sure what the <code>2801811</code> part means. I could only find used solenoids pulled from other dishwashers, no brand new ones, so I ended up buying one on eBay for $20.</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2023/05/Screenshot-2023-05-03-220413.png" class="kg-image" alt loading="lazy" width="907" height="878" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/Screenshot-2023-05-03-220413.png 600w, https://blog.iancaling.com/content/images/2023/05/Screenshot-2023-05-03-220413.png 907w" sizes="(min-width: 720px) 720px"></figure><p>I ran the dishwasher again after installing it, but the soap dispenser door still didn&apos;t pop open during the wash cycle. There must be something else wrong. There are two brown wires coming off of the solenoid that lead back to the main control board.</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230429_175455__01.jpg" class="kg-image" alt loading="lazy" width="2000" height="2118" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230429_175455__01.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230429_175455__01.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230429_175455__01.jpg 1600w, https://blog.iancaling.com/content/images/size/w2400/2023/05/IMG_20230429_175455__01.jpg 2400w" sizes="(min-width: 720px) 720px"></figure><p>Along the bottom of the control board you can see a connector labeled <code>BROWN</code> with two terminals labeled <code>DISP</code>:</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2023/05/Screenshot-2023-05-03-222247.png" class="kg-image" alt loading="lazy" width="422" height="300"><figcaption>Zoomed in and rotated</figcaption></figure><p>This is where those two brown wires lead to. One of the two wires simply connects to power. The other one leads into a triac (labeled <code>TR4</code> in the image above). </p><p>A triac is basically a high voltage switch that connects two spots on the circuit board when it receives a signal from a third, separate spot. You can think of it like a circuit breaker or a relay, except, unlike either of those, it&apos;s a solid-state semiconductor, so there are no moving parts.</p><p>In this case, the triac is used to make or break the circuit that allows power to flow to the solenoid. When the triac is triggered, the solenoid&apos;s power circuit is complete and power flows through the solenoid, unlatching the soap dispenser lid and releasing the soap.</p><p>Eagle-eyed readers may be able to make out that <code>TR4</code> in the image above has, unfortunately, exploded.</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230429_182902__01.jpg" class="kg-image" alt loading="lazy" width="1995" height="1608" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230429_182902__01.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230429_182902__01.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230429_182902__01.jpg 1600w, https://blog.iancaling.com/content/images/2023/05/IMG_20230429_182902__01.jpg 1995w" sizes="(min-width: 720px) 720px"></figure><p>Thankfully, these triacs are off-the-shelf parts (part number <code>0107NA</code>) you can buy online from any electronic components distributor (e.g. Mouser, DigiKey).</p><p>In my haste to fix the problem and get our dishwasher back in working order, I ended up purchasing a replacement from Amazon, because it was cheapest and had overnight shipping. The only catch was that pins 2 and 3 were swapped on the new triac, but I didn&apos;t let that dissuade me.</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230430_224123--2-.jpg" class="kg-image" alt loading="lazy" width="1769" height="2334" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230430_224123--2-.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230430_224123--2-.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230430_224123--2-.jpg 1600w, https://blog.iancaling.com/content/images/2023/05/IMG_20230430_224123--2-.jpg 1769w" sizes="(min-width: 720px) 720px"></figure><p>Unfortunately, after assembling the dishwasher again, the soap dispenser still wasn&apos;t working. Rather than looking for other problems, I started getting self-conscious that my Amazon triac, a <code>BTA16-600B</code>, may not have been the correct choice due to a minor difference in the datasheets, so I ended up ordering an exact replacement <code>0107NA</code> from Mouser instead.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230503_112743.jpg" class="kg-image" alt loading="lazy" width="2000" height="2664" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230503_112743.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230503_112743.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230503_112743.jpg 1600w, https://blog.iancaling.com/content/images/size/w2400/2023/05/IMG_20230503_112743.jpg 2400w" sizes="(min-width: 720px) 720px"><figcaption>I don&apos;t know what that white thing is on the leg of the triac</figcaption></figure><p>That&apos;s better! However, the dishwasher still didn&apos;t work after this.</p><p>I followed the trace leading up out of the first leg of the triac to figure out what other components were left to rule out. All that was left was what appears to be a big SMD microcontroller and one resistor. I figured the microcontroller was probably fine, since literally everything besides this soap dispenser seemed to be working, so that just left the resistor.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230503_165417__01.jpg" class="kg-image" alt loading="lazy" width="2000" height="1328" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230503_165417__01.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230503_165417__01.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230503_165417__01.jpg 1600w, https://blog.iancaling.com/content/images/2023/05/IMG_20230503_165417__01.jpg 2040w" sizes="(min-width: 720px) 720px"><figcaption>The resistor in question is the one on the right</figcaption></figure><p>My multimeter would not give a reading for this resistor&apos;s resistance, even after removing it from the circuit board, while the two next to it both correctly read as 220 ohms, so this resistor was definitely dead!</p><p>I don&apos;t have any SMD components on hand, but I do have plenty of regular old resistors.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2023/05/IMG_20230503_173759__01.jpg" class="kg-image" alt loading="lazy" width="1880" height="1847" srcset="https://blog.iancaling.com/content/images/size/w600/2023/05/IMG_20230503_173759__01.jpg 600w, https://blog.iancaling.com/content/images/size/w1000/2023/05/IMG_20230503_173759__01.jpg 1000w, https://blog.iancaling.com/content/images/size/w1600/2023/05/IMG_20230503_173759__01.jpg 1600w, https://blog.iancaling.com/content/images/2023/05/IMG_20230503_173759__01.jpg 1880w" sizes="(min-width: 720px) 720px"><figcaption>Perfect.</figcaption></figure><p>The new resistor obviously sits a little taller than the one it replaced, but the plastic enclosure that holds the control board in place still gives the new resistor enough clearance that it isn&apos;t touching anything.</p><p>To everyone&apos;s surprise, the soap dispenser works now. Our dishes are clean again!</p><p>In hindsight, I&apos;m curious if the triac I bought from Amazon would have worked fine had I found and replaced the dead resistor.</p><p>Just goes to show that it never hurts to open something up and try to diagnose the problem yourself before you pay to have someone else look at it or throw it away. Sometimes, the parts that went bad are easy to spot and source replacements for.</p><p>It&apos;s also an opportunity to exercise my problem-solving muscle and potentially learn something new about the inner workings of an everyday machine that I often take for granted. Challenging our collective acceptance of planned obsolescence is a nice bonus too. </p><p>Most complex things are actually just made up of a bunch of pretty simple things connected together, and, with a little research, can be broken down into digestible, bite-size chunks. Buying into the idea that anything technical is too complicated for &quot;laypeople&quot; to understand only serves corporations, who are eager for you to give up and hand them $700 for a brand new thing that shoots hot water and soap at your dishes. They&apos;ll even haul your old one away to the landfill so you don&apos;t have to think about that part.</p>]]></content:encoded></item><item><title><![CDATA[Attempting to block Youtube ads on a TCL Roku TV]]></title><description><![CDATA[<p>Our TCL Roku TV primarily exists to play Youtube videos. We recently noticed that it plays ads significantly more often than it used to, and much more frequently than our other Youtube viewing devices.</p><p>The first step I took to block the ads was installing <a href="https://pi-hole.net/">Pi-hole</a> in a Docker container</p>]]></description><link>https://blog.iancaling.com/attempting-to-block-youtube-ads-on-a-tcl-roku-tv/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99ce2</guid><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Fri, 24 Jul 2020 18:44:38 GMT</pubDate><content:encoded><![CDATA[<p>Our TCL Roku TV primarily exists to play Youtube videos. We recently noticed that it plays ads significantly more often than it used to, and much more frequently than our other Youtube viewing devices.</p><p>The first step I took to block the ads was installing <a href="https://pi-hole.net/">Pi-hole</a> in a Docker container on one of the Linux boxes on our network. Pi-hole&apos;s main purpose is to block ads by blackholing the DNS records of known advertising and tracking hosts. You can subscribe to enormous blocklists using Pi-hole&apos;s web interface to effectively prevent any devices on your network from communicating with any of these hosts.</p><p>You can use Pi-hole to block Youtube ads, but I found that Youtube videos are served from the same hosts that serve the ads, so using a Pi-hole to block the ads also prevents you from viewing any of the videos you want to see.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_22-43-10.png" class="kg-image" alt loading="lazy" width="977" height="372" srcset="https://blog.iancaling.com/content/images/size/w600/2020/07/Screenshot_2020-07-23_22-43-10.png 600w, https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_22-43-10.png 977w"><figcaption>A list of domains my TV asked the Pi-hole to look up while watching Youtube videos</figcaption></figure><p>If Youtube ads are served from the same hosts as the videos, I figured there must be some way to differentiate between the two. To try to determine what these differences are, I checked the HTTP requests my browser makes when trying to load a Youtube video and compared those to the requests made when loading ads.</p><p>These two types of requests appear very similar at first glance, but there are some differences.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_23-00-09.png" class="kg-image" alt loading="lazy" width="941" height="707" srcset="https://blog.iancaling.com/content/images/size/w600/2020/07/Screenshot_2020-07-23_23-00-09.png 600w, https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_23-00-09.png 941w"><figcaption>Left: normal Youtube video, Right: ad</figcaption></figure><p>After comparing the requests from a bunch of different videos and ads, I found that requests for ads consistently contained the URL parameter &quot;ctier=L&quot;, and the initial requests for any video contained the parameter &quot;aitags&quot;. The value of &quot;aitags&quot; varied, but it was always present.</p><p>This ended up being the only thing I needed to programmatically determine whether or not a request was for an ad or a normal video. To verify, I loaded up mitmproxy to create a man-in-the-middle proxy. mitmproxy sits in between your client (e.g. your TV) and the server (Youtube) and gives you full visibility and control over all of the data sent between them. I can see and modify anything that the client sends to Youtube, and vice versa.</p><p>I initially tested the mitmproxy ad blocker using my laptop, just by setting Firefox to send all requests through the proxy.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_23-14-04.png" class="kg-image" alt loading="lazy" width="702" height="487" srcset="https://blog.iancaling.com/content/images/size/w600/2020/07/Screenshot_2020-07-23_23-14-04.png 600w, https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_23-14-04.png 702w"><figcaption>Firefox proxy settings</figcaption></figure><p>Then I could see requests from my browser appearing in mitmproxy.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_23-15-27.png" class="kg-image" alt loading="lazy" width="933" height="300" srcset="https://blog.iancaling.com/content/images/size/w600/2020/07/Screenshot_2020-07-23_23-15-27.png 600w, https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_23-15-27.png 933w"><figcaption>Requests made by Firefox when loading Youtube videos</figcaption></figure><p>I utilized mitmproxy&apos;s scripting engine to perform the actual content matching and request blocking. mitmproxy allows you to write scripts that can interact with every request that goes through the proxy. You can view every detail of the request and alter the response in any way you please.</p><p>My script verifies the following things about a request before deciding to block it:</p><!--kg-card-begin: markdown--><ul>
<li>.googlevideo.com is in the URL</li>
<li>/videoplayback is in the URL</li>
<li>aitags appears in the URL parameters</li>
<li>ctier=L appears in the URL parameters</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><pre><code>from mitmproxy import http, ctx


def request(flow: http.HTTPFlow) -&gt; None:
    if &quot;.googlevideo.com&quot; in flow.request.pretty_url and \
       &quot;/videoplayback&quot; in flow.request.path and \
       &quot;aitags&quot; in flow.request.query and \
       flow.request.query.get(&quot;ctier&quot;, None) == &quot;L&quot;:
            # we found an ad, return dummy response
            ctx.log.info(&quot;***INTERCEPTING***&quot;)
            flow.response = http.HTTPResponse.make(
                200,  # status code
                b&quot;BLOCKED&quot;,  # content
                {&quot;Content-Type&quot;: &quot;text/html&quot;}  # headers
            )
</code></pre>
<!--kg-card-end: markdown--><p>It works! When I visited a Youtube video without an adblocker enabled in my browser, the video appeared to buffer for a few extra seconds while Youtube tried and failed to load in ads, and ultimately just loaded the video without playing any ads.</p><p>The log message from the script also appeared in the mitmproxy window, indicating that it decided to block an ad request.</p><figure class="kg-card kg-image-card kg-width-wide kg-card-hascaption"><img src="https://blog.iancaling.com/content/images/2020/07/Screenshot_2020-07-23_23-29-04.png" class="kg-image" alt loading="lazy" width="335" height="198"><figcaption>mitmproxy event log shows that the script is blocking requests</figcaption></figure><p>The next step was to get my TV sending requests through the proxy server. Unfortunately, Roku devices give users very limited access to network settings, so you can&apos;t even set a static IP address, let alone force the use of an HTTP proxy.</p><p>Luckily, mitmproxy also features a transparent proxy mode. This mode allows mitmproxy to receive normal HTTP/HTTPS requests as though it was an ordinary web server. The mitmproxy documentation contains instructions for setting up a Linux system to act as a transparent proxy: <a href="https://docs.mitmproxy.org/stable/howto-transparent/">https://docs.mitmproxy.org/stable/howto-transparent/</a></p><p>As mentioned in those instructions, in order to get requests flowing through my transparent mitmproxy, I had to make the Linux host the target device&apos;s default gateway. On many other systems, this would&apos;ve been a trivial settings change, but due to the restricted nature of the Roku TV, I had to make this change elsewhere.</p><p>My Roku TV receives its IP address and default gateway from my network&apos;s DHCP server, which is running on an Ubiquiti EdgeRouter Lite. To change my Roku TV&apos;s default gateway, I gave the TV a static DHCP mapping from the router&apos;s web interface. Then, from the router&apos;s CLI, I can assign that mapping a different default gateway than the rest of the devices on the network:</p><!--kg-card-begin: markdown--><pre><code>configure
edit service dhcp-server LAN1 DHCP subnet 192.168.0.0/24
set static-mapping ROKU-TV static-mapping-parameters &quot;option router 192.168.0.105;&quot;
commit; save
</code></pre>
<!--kg-card-end: markdown--><p>Now, after power cycling the TV, I can see in the settings menu that it receives a default gateway of 192.168.0.105, instead of my router&apos;s IP. This means that all traffic from my TV goes directly to my Linux machine instead of the Ubiquiti router. Now, HTTP and HTTPS requests made by the TV should appear in my mitmproxy window.</p><p>Interestingly, when powering on the TV and moving through the menus, I can see it make many unencrypted HTTP requests to various servers to download background images for the main screen, fonts, and layout information in XML format.</p><p>Unfortunately, although the Youtube app on my Roku TV does use HTTPS, they seem to have properly implemented certificate validation checks. This means that while my proxy setup functioned properly, the Youtube app on the Roku TV noticed that mitmproxy identified itself with an invalid certificate, so it aborts the connection.</p><p>There are a few other attack vectors I&apos;m interested in exploring.</p><!--kg-card-begin: markdown--><ul>
<li>Hardware-based attacks, such as physically opening the TV and looking for flash chips to dump. This is our only TV though, and I don&apos;t want to break it. It looks like people are selling replacement boards from inside the TV <a href="https://www.ebay.com/itm/TCL-40-MST10S-MAD4HG-P-N-V8-ST10K01-LF1V001-Main-Board-for-55S401-55S401TDAA/162890256890">for ~$20 on eBay</a>, so maybe I&apos;ll pick one of those up. <a href="https://fccid.io/W8U49S405/Internal-Photos/Internal-Photos-3314182">Looking at the board images from the FCC filing</a>, it looks like they used an MStar ARM SoC and a <a href="https://fccid.io/2AC23-WC0HR2601">Realtek RTL8812BU</a> based wifi module. There are a few headers on the board that look interesting, but nothing immediately jumps out at me as being a clear way in.</li>
<li>The unencrypted HTTP requests the Roku makes in the main menu. Messing with the layout XML or the images could potentially lead to some kind of vulnerability.</li>
<li>Uploading a channel to the Roku TV using developer mode</li>
</ul>
<!--kg-card-end: markdown--><p>Until then, I guess we will just deal with the ads.</p>]]></content:encoded></item><item><title><![CDATA[Ceragon FibeAir IP-10 Hidden User Backdoor Vulnerability (all versions)]]></title><description><![CDATA[<p>Ceragon FibeAir IP-10 wireless radios contain a hidden user account with a default password set by the vendor. This user can be accessed via both the web interface and SSH. In the web interface, this simply grants an attacker read-only access to the device&#x2019;s settings. However, when using</p>]]></description><link>https://blog.iancaling.com/ceragon-fibeair-ip-10-hidden-user-backdoor-vulnerability-all-versions/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99cde</guid><category><![CDATA[Vulnerability Disclosures]]></category><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Fri, 19 May 2017 04:57:00 GMT</pubDate><content:encoded><![CDATA[<p>Ceragon FibeAir IP-10 wireless radios contain a hidden user account with a default password set by the vendor. This user can be accessed via both the web interface and SSH. In the web interface, this simply grants an attacker read-only access to the device&#x2019;s settings. However, when using SSH, this user gives an attacker access to a Linux shell.</p><p>While the mateidu user does not have root privileges in the Linux shell, these devices run an outdated Linux kernel that may be vulnerable to privilege escalation exploits.</p><p>The vendor recommends that users &#x201C;log as mateidu user and change the password via the GUI this will close the old internal protection port access. [sic]&#x201D;</p><p>The mateidu user&#x2019;s password is the same as its username.</p><p>This vulnerability is similar to CVE-2015-0936, which detailed the discovery of an RSA key pair that allowed an attacker to log in as the mateidu user via SSH.</p><p><a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2017-9137">CVE-2017-9137</a></p><p>Timeline:</p><ul><li>2017/05/12 - Contacted vendor</li><li>2017/05/14 - Vendor acknowledges report</li><li>2017/05/16 - Vendor sends their recommendation</li><li>2017/05/18 - Publicly disclosed</li></ul>]]></content:encoded></item><item><title><![CDATA[Mimosa Wireless Radios - RCE, DoS, and Local File Disclosure Vulnerabilities]]></title><description><![CDATA[<p>Mimosa Client (e.g. C5) and Backhaul (e.g. B5) models (&lt;2.2.4) are vulnerable to multiple vulnerabilities, including local file disclosure, remote command execution (RCE), information leakage, and denial-of-service (DoS) vulnerabilities.</p><p>All vulnerabilities below affect versions &lt;2.2.3, except for the last one (authenticated RCE</p>]]></description><link>https://blog.iancaling.com/mimosa-wireless-radios-rce-dos-and-local-file-disclosure-vulnerabilities/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99cdd</guid><category><![CDATA[Vulnerability Disclosures]]></category><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Sat, 13 May 2017 04:52:00 GMT</pubDate><content:encoded><![CDATA[<p>Mimosa Client (e.g. C5) and Backhaul (e.g. B5) models (&lt;2.2.4) are vulnerable to multiple vulnerabilities, including local file disclosure, remote command execution (RCE), information leakage, and denial-of-service (DoS) vulnerabilities.</p><p>All vulnerabilities below affect versions &lt;2.2.3, except for the last one (authenticated RCE #2), which also affects version =2.2.3.</p><p>Mimosa AP&#x2019;s (&lt;2.2.3) are also vulnerable to the MQTT information leakage vulnerability explained below.</p><ul><li><strong>Information leakage in the web interface (leads to DoS)</strong>: There is a page in the web interface that will show you the device&#x2019;s serial number, regardless of whether or not you have logged in. There is another page that allows you to remotely factory reset the device simply by entering the serial number. (CVE-2017-9134) </li><li><strong>Information leakage in the MQTT broker (leads to DoS)</strong>: These devices run Mosquitto, a lightweight message broker, to send information between devices. By using the vendor&#x2019;s hard-coded credentials to connect to the broker on any device (whether it be an AP, Client, or Backhaul model), an attacker can view all the messages being sent between the devices. If an attacker connects to an AP, the AP will leak information about any clients connected to it, including the serial numbers, which can be used to remotely factory reset the clients. (CVE-2017-9132) </li><li><strong>Unauthenticated remote command execution (RCE) in the MQTT broker (leads to DoS)</strong>: By connecting to the MQTT broker on the wireless AP and a wireless client, an attacker can gather enough information to craft a command that reboots the client remotely when sent to the client&#x2019;s MQTT broker. This command can be re-sent endlessly to act as a DoS attack on the client. (CVE-2017-9131)</li><li><strong>Unauthenticated local file disclosure</strong>: In the device&#x2019;s web interface, there is a page that allows an attacker to use an unsanitized GET parameter to download files from the device as the root user. The attacker can download any file from the device&#x2019;s filesystem, including block device images. This can be used to view unsalted, MD5-hashed administrator passwords, which can then be cracked, giving the attacker full admin access to the device&#x2019;s web interface. This vulnerability can also be used to view the plaintext pre-shared key (PSK) for encrypted connections, or to view the device&#x2019;s serial number (which leads to DoS). (CVE-2017-9136)</li><li><strong>Authenticated remote command execution #1</strong>: In the device&#x2019;s web interface, after logging in, there is a page that allows you to ping other hosts from the device and view the results. The user is allowed to specify which host to ping, but this variable is not sanitized server-side, which allows an attacker to pass a specially crafted string to execute shell commands as the root user. (CVE-2017-9133)</li><li><strong>Authenticated remote command execution #2</strong>: On the backend of the device&#x2019;s web interface, there are more tests the user can run than just the ping test mentioned above. These other tests are not all shown on the webpage; some are only accessible by crafting a POST request with a program like cURL. There is one test accessible via cURL that does not properly sanitize user input, allowing an attacker to execute shell commands as the root user. (CVE-2017-9135)</li></ul><p>Timeline:</p><ul><li>2017/04/05 &#x2013; Vendor notified of some of the above vulnerabilities</li><li>2017/04/05 &#x2013; Vendor acknowledgement</li><li>2017/04/07 &#x2013; Vendor notified of web interface RCE #1</li><li>2017/04/07 &#x2013; Vendor acknowledges web interface RCE #1</li><li>2017/04/11 &#x2013; Vendor releases patch for all vulnerabilities that were known at the time</li><li>2017/04/11 &#x2013; Web interface RCE vulnerability #2 discovered and reported to vendor</li><li>2017/04/12 &#x2013; Vendor acknowledges vulnerability</li><li>2017/05/12 &#x2013; Public disclosure</li></ul>]]></content:encoded></item><item><title><![CDATA[DragonWave Horizon Hard-coded Credentials Vulnerability (multiple versions)]]></title><description><![CDATA[<p>DragonWave Horizon wireless radios have hard-coded login credentials meant to allow the vendor to access the devices.</p><p>It affects version 1.01.03, but I am unable to determine exactly which version contains the fix for this vulnerability. The vendor has confirmed that this vulnerability is fixed in the latest</p>]]></description><link>https://blog.iancaling.com/dragonwave-horizon-hard-coded-credentials-vulnerability-multiple-versions/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99cdc</guid><category><![CDATA[Vulnerability Disclosures]]></category><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Fri, 07 Apr 2017 04:50:00 GMT</pubDate><content:encoded><![CDATA[<p>DragonWave Horizon wireless radios have hard-coded login credentials meant to allow the vendor to access the devices.</p><p>It affects version 1.01.03, but I am unable to determine exactly which version contains the fix for this vulnerability. The vendor has confirmed that this vulnerability is fixed in the latest version (1.4.8 as of the time of writing).</p><p>DragonWave has a proprietary management program that can be used to administer their radios, called Merlin.</p><p>In Merlin, a user can connect to a DragonWave device via Telnet and issue commands. Merlin prompts the user for login credentials, however, when connecting to the device, Merlin first tries to authenticate using hard-coded credentials. These credentials were discovered by examining the Telnet traffic in Wireshark.</p><p>Credentials used by Merlin include (format is username:password):<br>b&amp;haul:msh*mark<br>vib*gyor:superb<br>energetic:wireless (default device credentials)</p><p>Some interesting commands I found after logging in:<br>Show admin credentials (plaintext): get super user<br>Show other credentials, if any (plaintext): get user accounts<br>Read bytes from RAM: read word &lt;hex address&gt; &lt;length&gt;</p><p>Timeline:<br>2017/03/29 &#x2013; Vendor notified<br>2017/03/30 &#x2013; Vendor says that vulnerability is already fixed in newest version<br>2017/04/06 &#x2013; Publicly disclosed</p><p>CVE ID: CVE-2017-7576</p>]]></content:encoded></item><item><title><![CDATA[Trango Altum AC600 Default root Login Vulnerability]]></title><description><![CDATA[<p>Trango Altum AC600&#x2032;s have a default root login that is accessible via both SSH and telnet by default. Logging in as root on this device gives you access to a Linux shell, granting you full control over the device.</p><p>One of our Trango Altum AC600&#x2032;s was</p>]]></description><link>https://blog.iancaling.com/trango-altum-ac600-default-root-login-vulnerability/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99cdb</guid><category><![CDATA[Vulnerability Disclosures]]></category><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Thu, 05 Jan 2017 05:49:00 GMT</pubDate><content:encoded><![CDATA[<p>Trango Altum AC600&#x2032;s have a default root login that is accessible via both SSH and telnet by default. Logging in as root on this device gives you access to a Linux shell, granting you full control over the device.</p><p>One of our Trango Altum AC600&#x2032;s was infected by a variant of the malware that spread between out-of-date Ubiquiti devices in May 2016 (<a href="https://t.umblr.com/redirect?z=http%3A%2F%2Fwww.securityweek.com%2Fworm-infects-many-ubiquiti-devices-old-vulnerability&amp;t=YzM0ZTQzNTdmNDJiYzk1NGIxNDMxZWNmNDQ4MDJhYTEyODIzNDk0YiwxTnB0SmVyRg%3D%3D&amp;b=t%3Ayh9qcdZZ21_z8sYodS-dhA&amp;p=https%3A%2F%2Fiancaling.tumblr.com%2Fpost%2F155395764003%2Ftrango-altum-ac600-default-root-login&amp;m=0">http://www.securityweek.com/worm-infects-many-ubiquiti-devices-old-vulnerability</a>).</p><p>The version of the malware from May spread between Ubiquiti devices by making use of a vulnerability in the web interface. This new variant simply connects to IP addresses via ssh, on both ports 22 and 2222, and then tries a series of credentials until it either authenticates successfully, or runs out of combinations to try.</p><p>In the case of our AC600, the malware on some other device was able to successfully log in to our AC600 using the username &#x201C;root&#x201D; and the password &#x201C;abcd1234&#x2033;. I tested this on other up-to-date AC600&#x2032;s we own, and it worked on them as well.</p><p>At the time of writing, this login is not documented anywhere on Trango&#x2019;s website, nor in any manuals. It is enabled by default and can be accessed via both SSH and telnet. It appears that you can change the root password without breaking anything.</p><p>CVE ID: <a href="https://t.umblr.com/redirect?z=https%3A%2F%2Fcve.mitre.org%2Fcgi-bin%2Fcvename.cgi%3Fname%3DCVE-2016-10306&amp;t=YmYwZGJhZmRlYjhmYzAzZGRhMTdlMjcyNjY1NjE1NDdjZGU2YzgyNywxTnB0SmVyRg%3D%3D&amp;b=t%3Ayh9qcdZZ21_z8sYodS-dhA&amp;p=https%3A%2F%2Fiancaling.tumblr.com%2Fpost%2F155395764003%2Ftrango-altum-ac600-default-root-login&amp;m=0">CVE-2016-10306</a></p><p>Timeline:</p><ul><li>2016/12/23 &#x2013; vulnerability reported to Trango</li><li>2017/01/03 &#x2013; no response yet, so I emailed Trango again</li><li>2017/01/04 &#x2013; disclosure posted</li><li>2017/01/09 &#x2013; initial response</li><li>2017/01/11 &#x2013; Trango says they will update the manual</li><li>2017/02/17 &#x2013; Trango still has not updated the manual</li></ul>]]></content:encoded></item><item><title><![CDATA[Siklu EtherHaul Unauthenticated Remote Command Execution Vulnerability (<7.4.0)]]></title><description><![CDATA[<p>Siklu EtherHaul devices are vulnerable to a remote command execution (RCE) vulnerability. This vulnerability allows an attacker to execute commands and retrieve information such as usernames and plaintext passwords from the device with no authentication.</p><p>Siklu EtherHaul devices (wireless point-to-point radios) have a feature in the web interface that allows</p>]]></description><link>https://blog.iancaling.com/siklu-etherhaul-unauthenticated-remote-command-execution-vulnerability-7-4-0/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99cda</guid><category><![CDATA[Vulnerability Disclosures]]></category><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Fri, 30 Dec 2016 05:47:00 GMT</pubDate><content:encoded><![CDATA[<p>Siklu EtherHaul devices are vulnerable to a remote command execution (RCE) vulnerability. This vulnerability allows an attacker to execute commands and retrieve information such as usernames and plaintext passwords from the device with no authentication.</p><p>Siklu EtherHaul devices (wireless point-to-point radios) have a feature in the web interface that allows you to configure both radios in a pair from either side. In other words, you can log in to the tower-side radio and use that to configure the radio on the other end, and vice versa, assuming that that they already have a wireless connection established.</p><p>I was curious how they accomplished this, so I started my investigation just by running a quick port scan on one of ours, using nmap.</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2019/01/image.png" class="kg-image" alt loading="lazy"></figure><p>22 and 443 are for management, but 555 was a mystery to me.</p><p>Connecting to port 555 via telnet just closes the connection after a couple seconds, however, sometimes, if you repeatedly connect and hit enter a few times, it will eventually output a bunch of information about the signal level, formatted in XML.</p><p>The web interface on the EtherHauls will refresh the information displayed on the page, such as the signal level, every few seconds. Examining those requests in Chrome&#x2019;s developer console reveals that they return the exact same XML that we saw when connecting via port 555. The web interface on the EtherHauls appears to connect to port 555 on both itself and the other radio in the pair in order to retrieve the information it displays in the web interface.</p><p>Further examination of these requests also revealed the command that was used to retrieve this particular information: &#x201C;mo-info rf&#x201D;. Performing other actions in the web interface revealed other commands as well. Entering these commands via telnet didn&#x2019;t appear to do anything, so at this point, it became necessary to delve deeper to see exactly what the devices were saying to each other on port 555.</p><p>Using another vulnerability I found on the EtherHauls, I was able to log in as root and access a Linux shell. The EtherHauls have a tcpdump binary on them, which allowed me to record a packet capture of all traffic involving port 555 and see exactly what data was being sent between the devices. </p><p>Prior to the &#x201C;mo-info rf&#x201D; command being sent, the device making the request first &#x201C;authenticates&#x201D; by sending the username of whoever is logged in, surrounded by a lot of null bytes:</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2019/01/image-1.png" class="kg-image" alt loading="lazy"></figure><p>Immediately after the username is sent, the command goes out with only 1 null byte on the very end:</p><figure class="kg-card kg-image-card"><img src="https://blog.iancaling.com/content/images/2019/01/image-2.png" class="kg-image" alt loading="lazy"></figure><p>I tried following this same basic procedure in telnet, sending &#x201C;admin&#x201D; and then sending &#x201C;mo-info rf&#x201D;, but being unable to easily send the null bytes in telnet, I experienced mixed results. It appeared to work sometimes, but extremely inconsistently.</p><p>I threw together a script in Python that opens a socket on port 555 and sends the full payload, including all the null bytes, effectively pretending to be another EtherHaul. This worked perfectly, and I was consistently able to get the response I was expecting from the device.</p><p>While playing around with sending various commands to the EtherHauls, I found that one command actually retrieves the usernames and passwords from the device in plaintext. This command gets inconsistent results; sometimes it works, other times, the device will always return blanks for the password. However, you can also send a command that sets a new password on the admin user. Links to proof of concept exploits are at the bottom of the post.</p><p>Security concerns from this vulnerability:<br>Passwords are stored in plaintext on the device<br>The service running on port 555 authenticates the user using only the username. No password is required.<br>This service doesn&#x2019;t implement any kind of ACL or firewall, meaning anyone on the internet can access it.</p><p>Timeline:<br>2016/12/22 &#x2013; Vulnerability reported to Siklu<br>2016/12/22 &#x2013; Initial response from Siklu<br>2016/12/25 &#x2013; Siklu confirms the vulnerability and says they&#x2019;re working on a patch<br>2017/02/13 &#x2013; Siklu releases an update for all models but the EH-1200 and EH-1200TL (those two are EOL)<br>2017/02/20 &#x2013; Publicly disclosed</p><p>Exploits:<br>Show username and password in plaintext: <a href="https://gist.github.com/ianling/c06636fba1b294393f0d3b7df082aa91">https://gist.github.com/ianling/c06636fba1b294393f0d3b7df082aa91</a><br>Set password to &#x201C;Abc123123&#x2033;: <a href="https://gist.github.com/ianling/6f4b8c76aa369618e3ae7dd494958762">https://gist.github.com/ianling/6f4b8c76aa369618e3ae7dd494958762</a></p><p>CVE ID: CVE-2017-7318</p>]]></content:encoded></item><item><title><![CDATA[Trango Systems Hidden root Account Vulnerability (all models)]]></title><description><![CDATA[<p>tl;dr: Trango devices all have a built-in, hidden root account, with a default password that is the same across many devices and software revisions. This account is accessible via ssh and grants access to the underlying embedded unix OS on the device, allowing full control over it. Recent software</p>]]></description><link>https://blog.iancaling.com/trango-systems-hidden-root-account-vulnerability-all-models/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99cd9</guid><category><![CDATA[Vulnerability Disclosures]]></category><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Fri, 11 Nov 2016 05:38:00 GMT</pubDate><content:encoded><![CDATA[<p>tl;dr: Trango devices all have a built-in, hidden root account, with a default password that is the same across many devices and software revisions. This account is accessible via ssh and grants access to the underlying embedded unix OS on the device, allowing full control over it. Recent software updates for some models have changed this password, but have not removed this backdoor.</p><p>Around a year ago, I extracted a software update package for a Trango GigaPlus radio and found that it simply contained an ext2 filesystem image. After mounting that, I checked /etc/shadow and found a hashed root password, which I immediately put into Cain &amp; Abel, but since I had no idea what length the password was, or what sort of characters it contained, I didn&#x2019;t end up making any progress bruteforcing it.</p><p>More recently, I took another look at the filesystem image. I ended up finding some login credentials, but not for the root account. Instead, it was for Trango&#x2019;s FTP server, which hosts many of their software update packages.</p><p>I downloaded many old packages for their legacy devices, figuring that they were probably much worse at securing their devices 5 years ago than they are now, so looking at those may reveal more than looking at recent packages would.</p><p>One of the packages I downloaded contained the root password I was looking for in plaintext. After verifying that it worked on our devices, I immediately reported the find to Trango, who removed the package containing the plaintext password from their FTP server. They said they&#x2019;d get back to me within a week about next steps.</p><p>That same day, I also spoke to a Trango rep on the phone. He said that while this root password worked on some older devices, the password had been changed to something longer in newer device/software versions. This means that the vulnerability still exists in all software revisions of their devices, but with a different password than the one I found.</p><p>Three weeks later, I still hadn&#x2019;t heard back, so I emailed them again asking for an update. I also asked if it would be safe to go ahead and change the root passwords ourselves on our devices, so that we didn&#x2019;t have to wait for an update to be released. The rep said that it was safe to change the password ourselves, and that there &#x201C;is no known vulnerability with our product or the software,&#x201D; which I take to mean that they don&#x2019;t consider this root backdoor a vulnerability.</p><p>While I was going through the filesystem, I also made an interesting discovery with regard to how ssh works on some of their devices. When you connect to a GigaPlus, for example, via ssh, the shell (/bin/sh) immediately spawns a telnet connection to 127.0.0.1, which is what gives you the proprietary configuration CLI. If you end the telnet session without ending the ssh session, either by pressing Ctrl+d or Ctrl+], then it drops you back into the ssh connection, which is just a unix shell.</p><p>Obviously having full root access to this unix shell gives you a lot more control over these devices than just having access to the device configuration CLI, making this vulnerability even more serious. Devices compromised in this way can easily be added to botnets, such as the massive one recently aimed at Dyn.</p><p>While I was waiting for a response from Trango, I also took the liberty of going through the software packages I had access to via their FTP server and determining what versions of each product use the shorter password I found:</p><p>Affected (the short password):</p><p>Apex &lt;= 2.1.1 (latest)<br>ApexLynx &lt; 2.0<br>ApexOrion &lt; 2.0<br>ApexPlus &lt;= 3.2.0 (latest)<br>Giga &lt;= 2.6.1 (latest)<br>GigaLynx &lt; 2.0<br>GigaOrion &lt; 2.0<br>GigaPlus &lt;= 3.2.3 (latest)<br>GigaPro &lt;= 1.4.1 (latest)<br>StrataLink &lt; 3.0<br>StrataPro - all versions?</p><p>I couldn&#x2019;t test the SpartaElite software because the packages are encrypted. The StrataPro was the device that contained the root password in plaintext, and all of its packages were removed from the FTP server, so I wasn&#x2019;t able to test those either.</p><p>Also, it&#x2019;s important to keep in mind that just because one of Trango&#x2019;s devices isn&#x2019;t listed above, doesn&#x2019;t mean it isn&#x2019;t vulnerable to this root backdoor; it just means that the one password I found isn&#x2019;t working. All of their devices still appear to have a root account accessible via ssh using other passwords, and passwords are all stored as a salted MD5 hash, so it&#x2019;s only a matter of time&#x2026;</p><p>Timeline:</p><p>2015 &#x2013; backdoor first discovered<br>2016/10/07 &#x2013; password found<br>2016/10/07 &#x2013; reported to trango via email<br>2016/10/07 &#x2013; spoke to trango rep on the phone<br>2016/10/07 &#x2013; trango said they&#x2019;d get back to me next week with next steps<br>2016/11/03 &#x2013; Emailed trango again asking for an update, as I hadn&#x2019;t heard anything back from them<br>2016/11/07 &#x2013; trango responded, said it&#x2019;d be okay for us to change the root passwords manually, implied that they don&#x2019;t consider this a vulnerability and they won&#x2019;t be fixing it</p><p>Demonstration:</p><p>ianl@ianl-laptop:~$ ssh root@1.2.3.4<br>root@1.2.3.4 password:<br>Trango System: &#xA0;TrangoLINK GigaPlus Command Line Interface v3.2.3<br>(CLI-view)#<br>&lt;press Ctrl+d to kill telnet connection&gt;<br>#<br># id<br>uid=0(root) gid=0(root) groups=0(root),10(wheel)</p><p>CVE ID&#x2019;s: <br>CVE-2016-10305<br>CVE-2016-10306<br>CVE-2016-10307</p><p>edit (2016/12/23): I found another password, this one goes to the Trango Altum AC600&#x2032;s: &#x201C;abcd1234&#x2033;. Yeah.</p>]]></content:encoded></item><item><title><![CDATA[Authentication bypass in Ceragon FibeAir IP-10 web interface (<7.2.0)]]></title><description><![CDATA[<p>Vendor:<br>=================<br><a href="https://www.ceragon.com/">www.ceragon.com</a></p><p>Product:<br>======================<br>-FibeAir IP-10 (&lt;7.2.0)</p><p>Vulnerability Type:<br>===================<br>Authentication Bypass</p><p>Vulnerability Details:<br>=====================<br>Ceragon FibeAir IP-10 devices do not properly ensure that a user has authenticated before granting them access to the web interface of the device. The attacker simply needs to add a cookie to</p>]]></description><link>https://blog.iancaling.com/authentication-bypass-in-ceragon-fibeair-ip-10-web-interface-7-2-0/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99cd8</guid><category><![CDATA[Vulnerability Disclosures]]></category><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Thu, 16 Jun 2016 04:34:00 GMT</pubDate><content:encoded><![CDATA[<p>Vendor:<br>=================<br><a href="https://www.ceragon.com/">www.ceragon.com</a></p><p>Product:<br>======================<br>-FibeAir IP-10 (&lt;7.2.0)</p><p>Vulnerability Type:<br>===================<br>Authentication Bypass</p><p>Vulnerability Details:<br>=====================<br>Ceragon FibeAir IP-10 devices do not properly ensure that a user has authenticated before granting them access to the web interface of the device. The attacker simply needs to add a cookie to their session named &#x201C;ALBATROSS&#x201D; with the value &#x201C;0-4-11&#x201D;. They can then browse to one of the following URL&#x2019;s (varies by model number and software version) to add their own user account with full admin privileges:</p><p>/responder.fcgi1?winid=106&amp;winname=Users%20%26%20Groups&amp;slot=1&amp;mainslot=1<br>/responder.fcgi1?winid=109&amp;winname=Users%20%26%20Groups&amp;slot=1&amp;mainslot=1<br>/responder.fcgi1?winid=103&amp;winname=Users%20%26%20Groups&amp;slot=1&amp;mainslot=1<br>/responder.fcgi0?winid=89&amp;winname=Users%20%26%20Groups&amp;slot=0</p><p>After adding their own user account, they can clear their cookies and log in with the new credentials they created.</p><p>Affected versions:<br>All versions below 7.2.0</p><p>Disclosure Timeline:<br>===================================<br>Vendor Notification: May 5, 2016<br>Public Disclosure: June 15, 2016</p><p>Severity Level:<br>================<br>Critical</p><p>CVE ID: <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10309">CVE-2016-10309</a></p>]]></content:encoded></item><item><title><![CDATA[Siklu EtherHaul Hidden ‘root’ Account Vulnerability (<6.9.0 / <3.7.1)]]></title><description><![CDATA[Siklu EtherHaul radios have a built-in, hidden root account, with an unchangeable password that is the same across all devices. ]]></description><link>https://blog.iancaling.com/siklu-etherhaul-hidden-root/</link><guid isPermaLink="false">6175c2bfbe4db47cc6e99cd7</guid><category><![CDATA[Vulnerability Disclosures]]></category><dc:creator><![CDATA[Ian C A Ling]]></dc:creator><pubDate>Fri, 03 Jun 2016 04:29:00 GMT</pubDate><content:encoded><![CDATA[<p><strong><strong><strong><strong>tl;dr:</strong></strong> </strong></strong>Siklu EtherHaul radios have a built-in, hidden root account, with an unchangeable password that is the same across all devices. This account is accessible via both ssh and the device&#x2019;s web interface and grants access to the underlying embedded Linux OS on the device, allowing full control over it.</p><p>Before I start, some background info: Siklu is a company based out of Israel that produces wireless point-to-point radios. You basically buy two radios and point them at each other to establish a wireless network connection between the two, for connecting office buildings without having to pay anyone to lay fiber or something.</p><p>On December 2nd, 2015, I received an automated abuse report email stating that a device on my network (a Siklu EtherHaul) had participated in some attacks on someone else&#x2019;s servers. </p><p>This was my first clue that there was something wrong with these devices internally. The CLI and web interface that I have seen on the EtherHaul is fairly locked down, so an attack of this nature originating from these devices should not have been possible, even if someone had somehow managed to use my administrator login to get into the device. My first guess was that Siklu had probably implemented a hidden backdoor on the devices for shell access, and that someone else had discovered this backdoor.</p><p>I reached out to Siklu, asking them if they were aware of any vulnerabilities that had yet to be patched in the EtherHaul devices. As it turned out, my device was several software versions behind, so there was already an update available. The Siklu rep I was emailing told me that the newest update fixed a vulnerability that bore similar symptoms to what my device was exhibiting, but would not get any more specific than that.</p><p>This spurred my curiosity, so I downloaded both software versions, the one I was currently on, and the newest update, and extracted them both. The software binaries are simply SquashFS images:</p><figure class="kg-card kg-image-card"><img src="https://66.media.tumblr.com/ef0ec92b181fc7ee02bf0776fa674217/tumblr_inline_o1zeflihbG1qehtvu_1280.png" class="kg-image" alt="image" loading="lazy"></figure><p>The SquashFS image begins at offset 131072, and there are no other images after it, so it&#x2019;s easy to pull it out with dd:</p><p>dd if=SW_siklu-uimage-3.5.3-13654 bs=1 skip=131072 of=uimage.sqfs</p><p>After that, I used &#x201C;unsquashfs&#x201D; to extract the image to a regular directory tree, giving me access to all the files in the root mountpoint of the EtherHaul. I wonder if there is any sort of validation within the device to prevent it from being flashed with modified firmware, but I will explore that some other time.</p><p>I dove straight into /etc/shadow, the file containing the hashed passwords for the user accounts in Linux, and found that there are a total of four user accounts on the devices by default: </p><ul><li>admin (the standard login that you use to configure the device)</li><li>root</li><li>sshd</li><li>emergency</li></ul><p>I fed the shadow file to Jack the Ripper and let it run in the background while I continued to explore. My exploration didn&#x2019;t last long though, as I ended up finding /etc/www/main/copy.bat, which contains the default root password in plaintext (it&#x2019;s only 7 characters, lowercase alphanumeric, so it wouldn&#x2019;t have taken John long to crack anyway).</p><p>I tested to see if this root account worked on any of my devices, and it does:</p><p>ianl@ianl-laptop:~$ ssh root@1.2.3.4 -p22<br>EH-&lt;&#x2026;&gt;, S/N: &lt;&#x2026;&gt;, Ver: &#xA0;6.X.X<br>root@1.2.3.4&#x2019;s password:</p><p>BusyBox v1.2.1 (2015.02.18-16:04+0000) Built-in shell (ash)<br>Enter &#x2018;help&#x2019; for a list of built-in commands.</p><p>~ # id<br>uid=0(root) gid=0(root)</p><p>As shown above, it drops you directly into a BusyBox shell as root, giving you full control over the device. It also allows you to log in to the device&#x2019;s web interface and make changes there.</p><p>John the Ripper did make quick work of the other two passwords; both are identical to the usernames:</p><ul><li>sshd:sshd</li><li>emergency:emergency</li></ul><p>Both of these logins allow you to access the web interface (but only with read permissions; you are not able to change any of the settings), but neither give ssh access. Attempting to log in to ssh using the &#x2018;sshd&#x2019; user just closes the connection, while logging in as &#x2018;emergency&#x2019; displays some Base64 before closing the connection. I have no idea what the Base64 is for, and decrypting it reveals nothing.</p><figure class="kg-card kg-image-card"><img src="https://66.media.tumblr.com/d91b98fd0ca9d64d620067d7766ec9ae/tumblr_inline_o23j1qBWGf1qehtvu_500.png" class="kg-image" alt="image" loading="lazy"></figure><p>(censored parts of Base64 in case it contains anything private)</p><p>I disclosed this vulnerability to Siklu immediately after finding it, and they responded extremely quickly. I had several phone calls and emails back and forth with a representative, and the issue was forwarded to their R&amp;D department on the same day. The representative kept me up-to-date with how they plan to fix it, and their timeline for getting an update out.</p><p>However, we have many of these devices deployed in production, and I did not want to leave these devices vulnerable to any attacks, so I asked if we could simply change the root password while we were waiting for a patch. I also mentioned in this email that I was a bit apprehensive about doing this because I guessed (correctly, it turns out) that this root password is used internally by the devices themselves and could brick them if it is changed. Siklu advised me not to change the password.</p><p>On 2016/02/04, more than two months after disclosure, Siklu released software version 6.9.0 for some Etherhaul models. There is no mention of this vulnerability in the patch notes, but the Siklu representative did confirm that this release contains a fix for this vulnerability:</p><figure class="kg-card kg-image-card"><img src="https://66.media.tumblr.com/5b588f7147fae266155a289db0337b38/tumblr_inline_o23jcoy5PN1qehtvu_1280.png" class="kg-image" alt="image" loading="lazy"></figure><p>The most concerning part though, is the bottom of the release notes, which states that this update is optional. There is no indication that this update fixes a major security vulnerability that affects all Etherhaul devices.</p><p>Another point of concern is that, as of the time this write-up is published (2016/06/02), an update has not been publicly released for the EH-1200/TL models, meaning that they are still vulnerable, 6 months after disclosure. If you have any Siklu Etherhaul devices in your network, you should ensure that they are up-to-date, and that they are not accessible on any public IP addresses.</p><p>CVE ID: <a href="https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10308">CVE-2016-10308</a></p><p><strong><strong>UPDATE: </strong></strong>Siklu released an update for the EH-1200/TL models on June 27th, 2016. The patch notes do contain information regarding the vulnerability this time.</p>]]></content:encoded></item></channel></rss>