<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/rss-style.xsl" type="text/xsl"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	    xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	     xmlns:dc="http://purl.org/dc/elements/1.1/"
	   xmlns:atom="http://www.w3.org/2005/Atom"
	     xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	  xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>
<channel>
	<title>hacking &#8211; Terence Eden’s Blog</title>
	<atom:link href="https://shkspr.mobi/blog/tag/hacking/feed/" rel="self" type="application/rss+xml" />
	<link>https://shkspr.mobi/blog</link>
	<description>Regular nonsense about tech and its effects 🙃</description>
	<lastBuildDate>Wed, 19 Nov 2025 04:43:45 +0000</lastBuildDate>
	<language>en-GB</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=6.9.4</generator>

<image>
	<url>https://shkspr.mobi/blog/wp-content/uploads/2023/07/cropped-avatar-32x32.jpeg</url>
	<title>hacking &#8211; Terence Eden’s Blog</title>
	<link>https://shkspr.mobi/blog</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title><![CDATA[Making My Own Hacktoberfest T-Shirts]]></title>
		<link>https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/</link>
					<comments>https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 04 Jul 2025 11:34:54 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[Hacktoberfest]]></category>
		<category><![CDATA[t-shirt]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=61656</guid>

					<description><![CDATA[Between 2014 and 2022, DigitalOcean sent free t-shirts to developers who completed the Hacktoberfest challenge.  For entirely sensible reasons related to sustainability and spammy entrants, they stopped doing physical merchandise in 2023.  I&#039;m the sort of hip fashionista who only wears free conference t-shirts.  GDS@GDSTeamWe support open source. And we’ve got the t-shirts to prove it (thanks @…]]></description>
										<content:encoded><![CDATA[<p>Between 2014 and 2022, DigitalOcean sent free t-shirts to developers who completed the Hacktoberfest challenge.  For entirely sensible reasons related to sustainability and spammy entrants, they stopped doing physical merchandise in 2023.</p>

<p>I'm the sort of hip fashionista who <em>only</em> wears free conference t-shirts.</p>

<blockquote class="social-embed" id="social-embed-958377102641893376" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/GDSTeam" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRt4BAABXRUJQVlA4INIBAADQCACdASowADAAPrVKn0snJCMhpzgO2OAWiWwAtGOAQADeTUO3VAHt3+mUAa8vVV0OeXOkLkf2mNAwlnwjfbQGeO/oPw0QIE22U14pwqAAAP7tg4IpPv/wQXUHnW8H/7dn/+yAf/ZAP6fcAEAEOr0lN3rLmM+Wk1up6N+kazcl/Abt270AvZTfvE6X1RSsD+z5eBziALv0ORrElnCWCSLc6vPOi3N5FglKAuXQAJ/1e1jT7ZJM4RrWz4wEgm4/y4wDKMv0sEtbYY0anAWPE2MDs7mHpT6aRffkb7fchUdIQ3jUKmSMNXCJ5o6681y5TBHnnbV5MuKUg5//65SApSbC5xnIWFGYATe4t3TsrQRe8zzxFYDXFFpX6Z90BYKkAYpsqlqtMeyJTJqLPbTBIuzYxyyMvxuGyHGOuHzWDB7rPST6uWBuJuV8Asv2q4bplPml3lZ8bIVgydoxCMzGFbGNa1OfWD0c2gA7kXc+vylSPJ8Z04z4qBxi8CWMAfBjarrwQEL2pXq2Jaoy+Z/MoO9geakW1YK9F5+Dth7nHl/mf0o5q3iaS3GWQ2jofNMmfSosmGpxfQYRuDp+kWt3nKiMR93BZNVqULfhgV1+FkmTyAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">GDS</p>@GDSTeam</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">We support open source. And we’ve got the t-shirts to prove it (thanks <a href="https://twitter.com/github">@github</a> <a href="https://twitter.com/digitalocean">@digitalocean</a>). GDS took part in <a href="https://twitter.com/hashtag/Hacktoberfest">#Hacktoberfest</a> this year, contributing to open source projects as part of a global community <a href="https://hacktoberfest.digitalocean.com/">hacktoberfest.digitalocean.com</a> <a href="https://x.com/gdsteam/status/958377102641893376/photo/1">pic.x.com/AkM09LGono</a><div class="social-embed-media-grid"><a href="https://pbs.twimg.com/media/DUzWotoW0AAFMmK.jpg" class="social-embed-media-link"><img class="social-embed-media" alt="Terence, Andrea and Anna wearing Hacktoberfest t-shirts" src="data:image/webp;base64,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"></a></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/GDSTeam/status/958377102641893376"><span aria-label="24 likes" class="social-embed-meta">❤️ 24</span><span aria-label="3 replies" class="social-embed-meta">💬 3</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2018-01-30T16:31:21.000Z" itemprop="datePublished">16:31 - Tue 30 January 2018</time></a></footer></blockquote>

<p>Sadly, after several years of constant catwalk modelling, my beloved Hacktoberfest shirts are full of holes. I couldn't find any for sale on eBay or Vinted - so I decided to make my own.</p>

<p>Note: <a href="https://github.com/Hacktoberfest/hacktoberfest-2022/blob/main/src/assets/brand-guidelines.pdf">DigitalOcean's Brand Guidelines</a> say that you shouldn't create physical merchandise or sell any products featuring the logo. Well, I'm not selling these nor, do I think, they are merchandise. Hacktoberfest aren't using these to incentivise anyone any more. They're just cool t-shirts.</p>

<h2 id="the-logos"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#the-logos">The Logos</a></h2>

<p>There are <a href="https://dev.to/fernandezbaptiste/last-10-years-of-hacktoberfest-merch-a-journey-through-time-8od">lots of photos of the t-shirts</a> but it is surprisingly hard to find the original assets.</p>

<h3 id="low-resolution"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#low-resolution">Low Resolution</a></h3>

<p>Kotis - a design agency - did the Hacktoberfest swag from 2015-2020.  They have a <a href="https://go.kotisdesign.com/portfolio/digital-ocean-hacktoberfest/">brand portfolio</a> with the t-shirt icons. Sadly, all a bit low resolution for printing, but good for getting accurate background colours for the material.</p>

<ul>
<li>2020 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-18.png" alt=""></li>
<li>2019 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-19.png" alt=""></li>
<li>2018 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-20.png" alt=""></li>
<li>2017 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-21.png" alt=""></li>
<li>2016 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-22.png" alt=""></li>
<li>2015 <img src="https://go.kotisdesign.com/wp-content/uploads/2020/02/Artboard-23.png" alt=""></li>
</ul>

<p>Similarly, there are a few low resolution promo shots of the t-shirts or their logos:</p>

<ul>
<li><a href="https://dev-to-uploads.s3.amazonaws.com/uploads/articles/2f1eggqi7zgs0cj38j2p.jpg">2022</a> (back of t-shirt)</li>
<li><a href="https://user-images.githubusercontent.com/99407553/194741467-af241be9-e0df-4f43-88a8-9236a253a555.jpg">2021</a> (t-shirt)</li>
<li><a href="https://cerealtree.wordpress.com/wp-content/uploads/2016/11/hacktober.png">2016</a> (more accurate colours)</li>
<li><a href="https://github.blog/wp-content/uploads/2015/09/d13f20be-66f9-11e5-8478-992126efc469.png">2015</a> (logo)</li>
<li><a href="https://hacktoberfesthowto.github.io/images/2014Logo.webp">2014</a> (logo)</li>
</ul>

<p>AI upscaling looked typically rubbish.</p>

<h3 id="higher-resolution-bitmaps"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#higher-resolution-bitmaps">Higher Resolution Bitmaps</a></h3>

<p>Some designers have their logo designs on Dribbble. Not <em>very</em> high resolution, but good enough for stickers.</p>

<ul>
<li><a href="https://dribbble.com/shots/8192199-Hacktoberfest-2019-logo">2019</a></li>
<li><a href="https://dribbble.com/shots/5333694-Hacktoberfest-2018">2018</a></li>
<li><a href="https://dribbble.com/shots/3814307-Hactoberfest-2017">2017</a></li>
<li><a href="https://dribbble.com/shots/2988111-Hactoberfest-2016">2016</a></li>
</ul>

<h3 id="archived-logos"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#archived-logos">Archived Logos</a></h3>

<p>The official Hacktoberfest website had some logos embedded on it:</p>

<ul>
<li><a href="https://web.archive.org/web/20221001041836/https://hacktoberfest.com/">2022</a> (SVG logo)</li>
<li><a href="https://web.archive.org/web/20190930141101im_/https://hacktoberfest.digitalocean.com/assets/logo-hf19-full-10f3c000cea930c76acc1dedc516ea7118b95353220869a3051848e45ff1d656.svg">2019</a> (SVG)</li>
<li><a href="https://web.archive.org/web/20181001075142if_/https://hacktoberfest.digitalocean.com/assets/logo-hacktoberfest-658b5aa2bd34e782d29c40bf6afbdff00f20fe1328efa6da17743878ba8db66f.png">2018</a> (PNG with transparent background)</li>
<li><a href="https://web.archive.org/web/20170913052813/https://hacktoberfest.digitalocean.com/">2017</a> (SVG)</li>
</ul>

<h2 id="best-of-the-bunch"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#best-of-the-bunch">Best of the bunch</a></h2>

<p>These are the best available logos. The SVGs are suitable for printing at any size, the PNGs may be harder.</p>

<ul>
<li><a href="https://static.wikia.nocookie.net/logopedia/images/7/7f/Hacktoberfest_icon_2022.svg">2022</a> (SVG logo)</li>
<li><a href="https://github.com/Hacktoberfest/hacktoberfest-2020/blob/master/app/assets/images/HF-full-logo.svg">2020</a> (SVG)</li>
<li><a href="//web.archive.org/web/20190930141101im_/https://hacktoberfest.digitalocean.com/assets/logo-hf19-full-10f3c000cea930c76acc1dedc516ea7118b95353220869a3051848e45ff1d656.svg">2019</a> (SVG)</li>
<li><a href="https://hacktoberfesthowto.github.io/images/2018Logo.webp">2018</a> (WebP 1155x898)</li>
<li><a href="//web.archive.org/web/20170913052813/https://hacktoberfest.digitalocean.com/">2017</a> (SVG embedded in page)</li>
<li><a href="//web.archive.org/web/20161022114022im_/https://hacktoberfest.digitalocean.com/assets/h-ceffbf9c09a918a4eda57f3a80f70e71b778ae233ece6f0ce41105316ddd3a64.svg">2016</a> (SVG)</li>
</ul>

<h2 id="missing"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#missing">Missing</a></h2>

<p>The following are missing  2014, 2015, 2021, 2022 (comic).  There are photos of the shirts, and some low-resolution artwork available, all of which are too low quality to be printed.  If you know how to get high-resolution images of them - please leave a comment!</p>

<h3 id="2021"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#2021">2021</a></h3>

<p>There are <em>some</em> elements out there. For example:</p>

<ul>
<li><a href="https://www.behance.net/gallery/128630281/HacktoberFest-2021">This Behance profile of Hacktoberfest 2021</a></li>
<li><a href="https://web.archive.org/web/20210930065625im_/https://hacktoberfest.digitalocean.com/_nuxt/img/logo-hacktoberfest-full.f42e3b1.svg">The official logo</a></li>
<li><a href="https://web.archive.org/web/20210928150155im_/https://hacktoberfest.digitalocean.com/_nuxt/img/logo-hacktoberfest-full2.aa1e9d9.svg">The logo with the t-shirt colour scheme</a></li>
<li><a href="https://web.archive.org/web/20210928150151/https://hacktoberfest.digitalocean.com/brandguidelines">The brand guidelines</a> for more accurate colour reproduction.</li>
</ul>

<h3 id="2014"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#2014">2014</a></h3>

<p>There's not much available about the first t-shirt. There's a <a href="https://hacktoberfesthowto.github.io/images/2014Logo.webp">version of the logo used</a> and <a href="https://community.nodebb.org/topic/2948/digital-ocean-free-t-shirts">some photos</a> but that's about it.</p>

<h2 id="photos-of-t-shirts"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#photos-of-t-shirts">Photos of T-Shirts</a></h2>

<p>If you want to compare the logos to the originals, and see what colour fabric they used, there are lots of photo online:</p>

<ul>
<li><a href="https://www.reddit.com/r/hacktoberfest/comments/16vzkes/here_is_my_collection_which_design_is_your/">Reddit collection</a></li>
<li><a href="https://hacktoberfesthowto.github.io/history/">History of Hacktoberfest</a></li>
</ul>

<h2 id="end-result"><a href="https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/#end-result">End Result</a></h2>

<p>If I can't find the missing logos, I'll create my own design for my own personal use. Something like this:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2025/07/double-t.webp" alt="Two t-shirts with the various Hacktoberfest logos stacked on them." width="1024" height="464" class="aligncenter size-full wp-image-61672">

<p>If you have a source for vectors of the missing logos, please drop me a comment.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=61656&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/07/making-my-own-hacktoberfest-t-shirts/feed/</wfw:commentRss>
			<slash:comments>2</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Reading NFC Passport Chips in Linux]]></title>
		<link>https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/</link>
					<comments>https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 24 Jun 2025 11:34:49 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[CyberSecurity]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[nfc]]></category>
		<category><![CDATA[rfid]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=61546</guid>

					<description><![CDATA[For boring and totally not nefarious reasons, I want to read all the data contained in my passport&#039;s NFC chip using Linux. After a long and annoying search, I settled on roeften&#039;s pypassport.  I can now read all the passport information, including biometrics.  Table of ContentsBackgroundRecreating the MRZPython code to generate an MRZCan you read a cancelled passport?Cryptography and other…]]></description>
										<content:encoded><![CDATA[<p>For boring and totally not nefarious reasons, I want to read all the data contained in my passport's NFC chip using Linux. After a long and annoying search, I settled on <a href="https://github.com/roeften/pypassport">roeften's pypassport</a>.</p>

<p>I can now read all the passport information, including biometrics.</p>

<p></p><nav role="doc-toc"><menu><li><h2 id="table-of-contents"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#table-of-contents">Table of Contents</a></h2><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#background">Background</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#recreating-the-mrz">Recreating the MRZ</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#python-code-to-generate-an-mrz">Python code to generate an MRZ</a></li></menu></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#can-you-read-a-cancelled-passport">Can you read a cancelled passport?</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#cryptography-and-other-security">Cryptography and other security</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#can-you-brute-force-a-passport">Can you brute-force a passport?</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#is-it-worth-brute-forcing-a-password">Is it worth brute-forcing a password?</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#installing">Installing</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#getting-structured-data">Getting structured data</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#saving-the-image">Saving the image</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#what-didnt-work">What didn't work</a><menu><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#mrtdreader">mrtdreader</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#jean-francois-houzards-and-olivier-rogers-pypassport">Jean-Francois Houzard's and Olivier Roger's pyPassport</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#beaujeans-pypassport">beaujean's pyPassport</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#d-logic">d-Logic</a></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#android-reader">Android reader</a></li></menu></li><li><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#is-it-worth-it">Is it worth it?</a></li></menu></li></menu></nav><p></p>

<h2 id="background"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#background">Background</a></h2>

<p>The NFC chip in a passport is protected by a password. The password is printed on the inside of the physical passport. As well as needing to be physically close to the passport for NFC to work<sup id="fnref:long"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:long" class="footnote-ref" title="There are some commercially available long range readers - up to 15cm! I've no doubt some clever engineer has made a some high-powered radio device which can read things from a mile away using a…" role="doc-noteref">0</a></sup>, you also need to be able to see the password. The password is printed in the "Machine Readable Zone" (MRZ) - which is why some border guards will swipe your passport through a reader before scanning the chip; they need the password and don't want to type it in.</p>

<p>I had a small problem though.  I'm using my old passport<sup id="fnref:old"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:old" class="footnote-ref" title="I'm not dumb enough to do this stuff on a live passport!" role="doc-noteref">1</a></sup> which <a href="https://www.gov.uk/government/publications/cancellation-of-passports/cancelling-british-passports-accessible#cancelling-epassport-version-2">has been cancelled</a>.  Cancelling isn't just about revoking the document. It is also physically altered:</p>

<blockquote><p>Cut off the bottom left hand corner of the personal details page, making sure you cut the MRZ on the corner opposite the photo.</p></blockquote>

<p>So a chunk of the MRZ is missing! Oh no! Whatever can we do!?</p>

<h3 id="recreating-the-mrz"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#recreating-the-mrz">Recreating the MRZ</a></h3>

<p>The password is made up of three pieces of data:</p>

<ol>
<li>Passport Number (Letters and Numbers)</li>
<li>Date of Birth (YYMMDD)</li>
<li>Expiry Date (YYMMDD)</li>
</ol>

<p>Each piece <em>also</em> has a checksum. This calculation is defined in Appendix A to <a href="https://www.icao.int/publications/Documents/9303_p3_cons_en.pdf">Part 3 of Document 9303</a>.</p>

<p>Oh, and there's a checksum for the entire string. It's this final checksum which is cut off when the passport cover is snipped.</p>

<p>The final password is: <code>Number Number-checksum DOB DOB-checksum Expiry Expiry-checkum checksum-of-previous-digits</code></p>

<h4 id="python-code-to-generate-an-mrz"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#python-code-to-generate-an-mrz">Python code to generate an MRZ</a></h4>

<p>If you know the passport number, date of birth, and expiry date, you can generate your own Machine Readable Zone - this acts as the password for the NFC chip.</p>

<pre><code class="language-python">def calculateChecksum( value ):
    weighting = [7,3,1]
    characterWeight = {
        '0': 0, '1': 1, '2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7,  
        '8': 8, '9': 9, '&lt;': 0, 'A':10, 'B':11, 'C':12, 'D':13, 'E':14, 
        'F':15, 'G':16, 'H':17, 'I':18, 'J':19, 'K':20, 'L':21, 'M':22, 
        'N':23, 'O':24, 'P':25, 'Q':26, 'R':27, 'S':28, 'T':29, 'U':30, 
        'V':31, 'W':32, 'X':33, 'Y':34, 'Z':35
    }
    counter = 0
    result = 0
    for x in value:
        result += characterWeight[str(x)] * weighting[counter%3]
        counter += 1
    return str(result%10)

def calculateMRZ( passportNumber, DOB, expiry ):
    """
    DOB and expiry are formatted as YYMMDD
    """
    passportCheck = calculateChecksum( passportNumber )
    DOBCheck      = calculateChecksum( DOB )
    expiryCheck   = calculateChecksum( expiry )
    mrzNumber  = passportNumber + passportCheck + DOB + DOBCheck + expiry + expiryCheck
    mrzCheck = calculateChecksum( mrzNumber ).zfill(2)
    mrz =  passportNumber + passportCheck + "XXX" + DOB + DOBCheck + "X" + expiry + expiryCheck + "&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;" + mrzCheck
    return mrz

print( calculateMRZ("123456789", "841213", "220229") )
</code></pre>

<h2 id="can-you-read-a-cancelled-passport"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#can-you-read-a-cancelled-passport">Can you read a cancelled passport?</a></h2>

<p>I would have thought that cutting the cover of the passport would destroy the antenna inside it. But, going back to <a href="https://www.gov.uk/government/publications/cancellation-of-passports/cancelling-british-passports-accessible#cancelling-epassport-version-2">the UK guidance</a>:</p>

<blockquote><p>You must not cut the back cover on the ePassport</p></blockquote>

<p>Ah! That's where the NFC chip is. I presume this is so that cancelled passports can still be verified for authenticity.</p>

<h2 id="cryptography-and-other-security"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#cryptography-and-other-security">Cryptography and other security</a></h2>

<p>The security is, thankfully, all fairly standard Public Key Cryptography - <a href="https://www.icao.int/publications/Documents/9303_p11_cons_en.pdf">9303 part 11</a> explains it in <em>excruciating</em> levels of detail.</p>

<p>One thing I found curious - because the chip has no timer, it cannot know how often it is being read. You could bombard it with thousands of password attempts and not get locked out.  Indeed, the specification says:</p>

<blockquote><p>the success probability of the attacker is given by the time the attacker has access to the IC, the duration of a single attempt to guess the password, and the entropy of the passport.</p></blockquote>

<h2 id="can-you-brute-force-a-passport"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#can-you-brute-force-a-passport">Can you brute-force a passport?</a></h2>

<p>Wellllll… maybeeeee…?</p>

<p>Passports are generally valid for only 10 years. So that's 36,525 possible expiry dates.</p>

<p>Passport holders are generally under 100 years old. So that's 3,652,500 possible dates of birth.</p>

<p>That's already 133,407,562,500 attempts - and we haven't even got on to the 1E24 possible passport numbers!</p>

<p>In my experiments, sending an incorrect but valid MRZ results in the chip returning "Security status not satisfied (0x6982)" in a very short space of time. Usually less than a second.</p>

<p>But sending that incorrect attempt seemed to introduce a delay in the next response - by a few seconds. Sending the correct MRZ seemed to reset this and let the chip be read instantly.</p>

<p>So, if you knew the target's passport number and birthday, brute forcing the expiry date would take a couple of days. Not instant, but not impossible.</p>

<p>Most <a href="https://www.nxp.com/docs/en/data-sheet/NTAG213_215_216.pdf">commercial NFC chips support 100,000 writes</a> with no limit for the number of reads. Some also have a 24 bit read counter which increments after every read attempt. After 16 million reads, the counter doesn't increment. It <em>could</em> be possible for a chip to self-destruct after a specific number of reads - but I've no evidence that passport chips do that.</p>

<h3 id="is-it-worth-brute-forcing-a-password"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#is-it-worth-brute-forcing-a-password">Is it <em>worth</em> brute-forcing a password?</a></h3>

<p>If you were to brute-force the MRZ, you would discover the passport-holder's date of birth.  You would also get:</p>

<ul>
<li>A digital copy of their photo,</li>
<li>Their full name,</li>
<li>Their sex<sup id="fnref:sex"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:sex" class="footnote-ref" title="Sex is complicated. But ICAO allow for &quot;F for female, M for male, or X for unspecified&quot;." role="doc-noteref">2</a></sup>,</li>
<li>The country which issued their passport, and</li>
<li>Their nationality.</li>
</ul>

<p>All of that is something which you can see from looking at the passport. So there's little value in attempting to read it electronically.</p>

<h2 id="installing"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#installing">Installing</a></h2>

<p>As mentioned, I'm using <a href="https://github.com/roeften/pypassport">https://github.com/roeften/pypassport</a></p>

<p>The only library I needed to install was <a href="https://pypi.org/project/pyasn1/">pyasn1</a> using <code>pip3 install pyasn1</code> - your setup may vary.</p>

<p>Download PyPassport. In the same directory, you can create a test Python file to see if the passport can be read. Here's what it needs to contain:</p>

<pre><code class="language-python">from pypassport import epassport, reader

#   Replace this MRZ with the one from your passport
MRZ = "1234567897XXX8412139X2202299&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;04"

def trace(name, msg):
    if name == "EPassport":
        print(name + ": " + msg)

r = reader.ReaderManager().waitForCard()

ep = epassport.EPassport(r, MRZ)
ep.register(trace)
ep.readPassport()
</code></pre>

<p>Plug in your NFC reader, place your passport on it, run the above code.  If it works, it will spit out a lot of debug information, including all the data it can find on the passport.</p>

<h2 id="getting-structured-data"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#getting-structured-data">Getting structured data</a></h2>

<p>The structure of the passport data is a little convoluted.  <a href="https://www.icao.int/publications/Documents/9303_p10_cons_en.pdf">The specification</a> puts data into different "Data Groups" - each with its own ID.</p>

<p>By running:</p>

<pre><code class="language-python">ep.keys()
</code></pre>

<p>You can see which Data Groups are available. In my case, <code>['60', '61', '75', '77']</code></p>

<ul>
<li><code>60</code> is the common area which contains some metadata. Nothing interesting there.</li>
<li><code>61</code> is DG1 - the full MRZ. This contains the holder's name, sex, nationality, etc.</li>
<li><code>77</code> is the Document Security Object - this was empty for me.</li>
<li><code>75</code> is DG2 to DG4 Biometric Templates - this contains the image and other metadata.</li>
</ul>

<p>Dumping the biometrics - <code>print( ep["75"] )</code> - gives these interesting pieces of metadata:</p>

<pre><code class="language-_">'83': '20190311201345',
'meta': {   'Expression': 'Unspecified',
            'EyeColour' : 'Unspecified',
            'FaceImageBlockLength': 19286,
            'FaceImageType': 'Basic',
            'FeatureMask': '000000',
            'FeaturePoint': {0: {'FeaturePointCode': 'C1',
                                'FeatureType': '01',
                                'HorizontalPosition': 249,
                                'Reserved': '0000',
                                'VerticalPosition': 216},
                            1: {'FeaturePointCode': 'C2',
                                'FeatureType': '01',
                                'HorizontalPosition': 141,
                                'Reserved': '0000',
                                'VerticalPosition': 214}},
            'Features': {},
            'Gender': 'Unspecified',
            'HairColour': 'Unspecified',
            'ImageColourSpace': 'RGB24',
            'ImageDataType': 'JPEG',
            'ImageDeviceType': 0,
            'ImageHeight': 481,
            'ImageQuality': 'Unspecified',
            'ImageSourceType': 'Static Scan',
            'ImageWidth': 385,
            'LengthOfRecord': 19300,
            'NumberOfFacialImages': 1,
            'NumberOfFeaturePoint': 2,
            'PoseAngle': '0600B5',
            'PoseAngleUncertainty': '000000',
            'VersionNumber': b'010'
        }
</code></pre>

<p>If I understand <a href="https://www.icao.int/security/mrtd/siteassets/pages/technical-reports/tr%20-%20rf%20and%20protocol%20testing%20part%204%20v2.10.pdf">the testing document</a> - the "Feature Points" are the middle of the eyes.  Interesting to see that gender (not sex!) and hair colour are also able to be recorded. The "PoseAngle" represents the <a href="https://www.icao.int/Security/FAL/TRIP/Documents/TR%20-%20Portrait%20Quality%20v1.0.pdf">pitch, yaw, and roll</a> of the face.</p>

<h3 id="saving-the-image"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#saving-the-image">Saving the image</a></h3>

<p>Passport images are saved either with JPEG or with <a href="https://www.icao.int/Security/FAL/TRIP/Documents/TR%20-%20Portrait%20Quality%20v1.0.pdf">JPEG2000 encoding</a>. Given the extremely limited memory available photos are small and highly compressed. Mine was a mere 19KB.</p>

<p>To save the image, grab the bytes and plonk them onto disk:</p>

<pre><code class="language-python">photo = ep["75"]["A1"]["5F2E"]
with open( "photo.jpg", "wb" ) as f:
   f.write( photo )
</code></pre>

<p>As expected, the "FeaturePoints" co-ordinates corresponded roughly to the centre of my eyes. Nifty!</p>

<h2 id="what-didnt-work"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#what-didnt-work">What didn't work</a></h2>

<p>I tried a few different tools. Listed here so you don't make the same mistakes as me!</p>

<h3 id="mrtdreader"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#mrtdreader">mrtdreader</a></h3>

<p>The venerable <a href="https://github.com/rubund/mrtdreader">mrtdreader</a>. My NFC device beeped, then mrtdreader said "No NFC device found."</p>

<p>I think this is because <a href="https://github.com/nfc-tools/libnfc/issues/719">NFC Tools haven't been updated in ages</a>.</p>

<h3 id="jean-francois-houzards-and-olivier-rogers-pypassport"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#jean-francois-houzards-and-olivier-rogers-pypassport">Jean-Francois Houzard's and Olivier Roger's pyPassport</a></h3>

<p>I looked at <a href="https://code.google.com/archive/p/pypassport/">pyPassport</a> but it is only available for Python 2.</p>

<h3 id="beaujeans-pypassport"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#beaujeans-pypassport">beaujean's pyPassport</a></h3>

<p>This <a href="https://github.com/beaujeant/pypassport">pypassport</a> only checks if a passport is resistant to specific security vulnerabilities.</p>

<h3 id="d-logic"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#d-logic">d-Logic</a></h3>

<p><a href="https://www.d-logic.com/nfc-rfid-reader-sdk/software/epassport-reading/">Digital Logic's ePassport software</a> only works with their hardware readers.</p>

<h3 id="android-reader"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#android-reader">Android reader</a></h3>

<p><a href="https://github.com/tananaev/passport-reader">tananaev's passport-reader</a> - works perfectly on Android. So I knew my passport chip was readable - but the app won't run on Linux.</p>

<h2 id="is-it-worth-it"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#is-it-worth-it">Is it worth it?</a></h2>

<p>Yeah, I reckon so! Realistically, you aren't going to be able to crack the MRZ to read someone's passport. But if you need to gather personal information<sup id="fnref:gdpr"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:gdpr" class="footnote-ref" title="Under the auspices of GDPR, of course!" role="doc-noteref">3</a></sup>, it's perfectly possible to do so quickly from a passport.</p>

<p>The MRZ is a <em>Machine Readable</em> Zone - so it is fairly simple to OCR the text and then pass that to your NFC reader.</p>

<p>And even if the MRZ is gone, you can reconstruct it from the data printed on the passport.</p>

<p>Of course, this won't be able to detect fraudulent passports. It doesn't check against a database to see if it has been revoked<sup id="fnref:interpol"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:interpol" class="footnote-ref" title="Nor does it check if the holder is on some Interpol list." role="doc-noteref">4</a></sup>. I don't think it will detect any cryptographic anomalies.</p>

<p>But if you just want to see what's on your travel documents, it works perfectly.</p>

<div id="footnotes" role="doc-endnotes">
<hr aria-label="Footnotes">
<ol start="0">

<li id="fn:long">
<p>There are some <a href="https://www.shopnfc.com/en/nfc-readers-writers/300-nfc-xl-reader-long-range-hf-reader.html">commercially available long range readers</a> - up to 15cm! I've no doubt some clever engineer has made a some high-powered radio device which can read things from a mile away using a <a href="https://www.makeuseof.com/tag/how-to-make-a-wifi-antenna-out-of-a-pringles-can-nb/">Pringle's tube</a>. Of note, the <a href="https://www.icao.int/publications/Documents/9303_p11_cons_en.pdf">ICAO guidance</a> says:</p>

<blockquote><p>the unencrypted communication between a contactless IC and a reader can be eavesdropped within a distance of several metres.</p></blockquote>

<p><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:long" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:old">
<p>I'm not dumb enough to do this stuff on a <em>live</em> passport!&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:old" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:sex">
<p>Sex is complicated<sup id="fnref:giggle"><a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fn:giggle" class="footnote-ref" title="Stop giggling at the back!" role="doc-noteref">5</a></sup>. But ICAO allow for "<a href="https://www.icao.int/publications/Documents/9303_p4_cons_en.pdf">F for female, M for male, or X for unspecified</a>".&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:sex" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:gdpr">
<p>Under the auspices of GDPR, of course!&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:gdpr" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:interpol">
<p>Nor does it check if the holder is on some Interpol list.&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:interpol" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

<li id="fn:giggle">
<p>Stop giggling at the back!&nbsp;<a href="https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/#fnref:giggle" class="footnote-backref" role="doc-backlink">↩︎</a></p>
</li>

</ol>
</div>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=61546&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2025/06/reading-nfc-passport-chips-in-linux/feed/</wfw:commentRss>
			<slash:comments>9</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Some thoughts on the YubiKey EUCLEAK Vulnerability]]></title>
		<link>https://shkspr.mobi/blog/2024/09/some-thoughts-on-the-yubikey-eucleak-vulnerability/</link>
					<comments>https://shkspr.mobi/blog/2024/09/some-thoughts-on-the-yubikey-eucleak-vulnerability/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 04 Sep 2024 11:34:57 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[cyb]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[yubikey]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=52897</guid>

					<description><![CDATA[It looks like everyone&#039;s favourite FIDO token provider might have an unpatchable vulnerability! Much Sturm und Drang from the usual sources. But how bad is it really?  Not so bad - but it does expose some weaknesses in the very idea of having physical tokens.  First up, as the research paper&#039;s abstract says:  The attack requires physical access to the secure element  So, straight off the bat,…]]></description>
										<content:encoded><![CDATA[<p>It looks like everyone's favourite FIDO token provider might have an unpatchable vulnerability! Much <i lang="de">Sturm und Drang</i> from the usual sources. But how bad is it really?  Not so bad - but it does expose <a href="https://shkspr.mobi/blog/2024/09/some-thoughts-on-the-yubikey-eucleak-vulnerability/#the-real-issue-with-fido-tokens">some weaknesses in the very idea of having physical tokens</a>.</p>

<p>First up, <a href="https://ninjalab.io/wp-content/uploads/2024/09/20240903_eucleak.pdf">as the research paper's abstract says</a>:</p>

<blockquote><p>The attack requires physical access to the secure element</p></blockquote>

<p>So, straight off the bat, this reduces the likelihood of attack. Someone would need to actively target you. Of course, if you're the sort of person who secures all their secrets and cryptowallets with a FIDO token, you may be a juicy target!</p>

<p>Secondly, the attack relies on:</p>

<blockquote><p>the adversary steal[ing] the login and password of a victim’s application account protected with FIDO</p></blockquote>

<p>So, you need to lose your username, password, <em>and</em> token for this attack to be successful. Again, this is unlikely to happen as a "drive-by" attack.</p>

<p>Once the attacker gets your FIDO token, they need to analyse it using "expensive equipment". A cost of approximately <a href="https://arstechnica.com/security/2024/09/yubikeys-are-vulnerable-to-cloning-attacks-thanks-to-newly-discovered-side-channel/">$11,000 according to Ars</a>.</p>

<p>That moves the attack away from the hands of casual criminals. It isn't an insurmountable barrier for organised crime or nation states.</p>

<p>Finally, <a href="https://ninjalab.io/wp-content/uploads/2024/09/20240903_eucleak.pdf#%5B%7B%22num%22%3A121%2C%22gen%22%3A0%7D%2C%7B%22name%22%3A%22XYZ%22%7D%2C89.292%2C740.862%2Cnull%5D">Appendix A</a> discusses how difficult it is to actually get the equipment close enough to the circuitry:</p>

<blockquote><p>[…] capturing the EM signal with a small EM probe would not work if this probe is too far from the chip. We hence have to open the YubiKey plastic case to access its logic board.
[…]
In both cases however, the device needs to be re-packaged if the adversary wants to give it back to legitimate user without him noticing. We did not study further this issue.</p></blockquote>

<p>Here's what it looks like when that probe is placed next to the circuitry:</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/09/probe.jpg" alt="Photo of electrical equipment placed very close to a circuit board." width="1600" height="1000" class="aligncenter size-full wp-image-52898">

<p>If you suddenly find your Yubikey smashed or cracked, then you <em>may</em> have been a victim of this attack!</p>

<p>A reasonable way to defend against this is to get some glittery nail polish. No, seriously! Put a blob of glitter polish on the seam of your device. Something like this:</p>

<p><a href="https://flickr.com/photos/effika/11377767954/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2024/09/11377767954_d03903ee67_c.jpg" alt="Nails painted with polish. An intricate pattern has formed." width="800" height="600" class="aligncenter size-full wp-image-52900"></a></p>

<p>Take a photo. If the baddies grab your YubiKey and crack it open, they won't easily be able to get the pattern correct when they re-seal it. Regularly compare your photo to your device.</p>

<h2 id="the-real-issue-with-fido-tokens"><a href="https://shkspr.mobi/blog/2024/09/some-thoughts-on-the-yubikey-eucleak-vulnerability/#the-real-issue-with-fido-tokens">The <em>Real</em> Issue With FIDO Tokens</a></h2>

<p>Physical tokens require physical security. I've moved to a <a href="https://shkspr.mobi/blog/2024/02/giving-the-finger-to-mfa-a-review-of-the-z1-encrypter-ring-from-cybernetic/">an Encrypter Ring</a>. I literally wear my FIDO token. I am <em>extremely</em> likely to notice someone removing my ring (or my finger).</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2024/02/Ring-width.jpg" alt="Photo of my fingers stretched out so you can see the width of the ring." width="512" height="512" class="aligncenter size-full wp-image-49605">

<p>Is your token on your keyring? Where is your keyring right now? In your pocket or hanging up somewhere?  Most people either leave their FIDO token laying around out of sight or have it permanently plugged in to their machine. I'm not sure which is worse.</p>

<p>The other major issue is that <a href="https://shkspr.mobi/blog/2022/12/how-do-i-revoke-a-fido-webauthn-token-from-every-service/">it is <em>impossible</em> to revoke a FIDO token from all your accounts at once</a>!</p>

<p>You've used your token to register with a few dozen sites, you either lose your key or discover it has been tampered with. What do you do?</p>

<p>There is no way to tell which sites you have used a FIDO token with. You have to remember (or keep a list somewhere). You will need to manually go to each site and revoke the stolen token.  If you've forgotten one, you can't revoke it from your key, which means attackers could have unfettered access to that account.</p>

<h2 id="what-should-i-do"><a href="https://shkspr.mobi/blog/2024/09/some-thoughts-on-the-yubikey-eucleak-vulnerability/#what-should-i-do">What should I do?</a></h2>

<p>The <a href="https://ninjalab.io/eucleak/">discoverers of this vulnerability take great pains to say</a>:</p>

<blockquote><p>it is still safer to use your YubiKey or other impacted products as FIDO hardware authentication token to sign in to applications rather than not using one.</p></blockquote>

<p>I think they are correct. But there are still a few things you should do to secure yourself against this class of attack.</p>

<ol start="0">
<li>Ensure the physical <em>security</em> of your token. Either wear it as jewellery, <a href="https://dangerousthings.com/">implant it in your skin</a>, or reduce the likelihood of it being taken.</li>
<li>Ensure the physical <em>integrity</em> of your token. Use nail-varnish or something similar to help you detect if it has been physically compromised.</li>
<li>Ensure that you know <em>which</em> sites have been secured with a Yubikey. Make a note of it in your password manager or other secure vault.</li>
<li>Ensure that you are less of a target. Don't brag about your security. Certainly don't post on the Internet about which security products you use and the countermeasures you take.  Oh shit.</li>
</ol>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=52897&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2024/09/some-thoughts-on-the-yubikey-eucleak-vulnerability/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Book Review: The Cuckoo's Egg - Clifford Stoll ★★★★★]]></title>
		<link>https://shkspr.mobi/blog/2023/10/book-review-the-cuckoos-egg-clifford-stoll/</link>
					<comments>https://shkspr.mobi/blog/2023/10/book-review-the-cuckoos-egg-clifford-stoll/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 11 Oct 2023 11:34:52 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[hacking]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=47417</guid>

					<description><![CDATA[This book is outstanding. It&#039;s the mid 1980s, you&#039;re administrating a nascent fleet of UNIX boxen, and you are tasked with accounting for a 75¢ billing discrepancy.  Naturally that eventually leads into an international conspiracy involving the FBI, NSA, and an excellent recipe for chocolate chip cookies. It is a fast paced, high-tension, page turner. There&#039;s also a sweet moral core to the story …]]></description>
										<content:encoded><![CDATA[<p><img src="https://shkspr.mobi/blog/wp-content/uploads/2023/10/cuckoos-egg-700.jpg" alt="Book cover - illustration of a person sat in front of a computer." width="210" height="350" class="alignleft size-full wp-image-47418">This book is <em>outstanding</em>. It's the mid 1980s, you're administrating a nascent fleet of UNIX boxen, and you are tasked with accounting for a 75¢ billing discrepancy.</p>

<p>Naturally that eventually leads into an international conspiracy involving the FBI, NSA, and an excellent recipe for chocolate chip cookies. It is a fast paced, high-tension, page turner. There's also a sweet moral core to the story - as well as the somewhat saddening death of naïvety.</p>

<p>It's hard to overstate just how fun this book is. Yes, with the benefit of hindsight running unpatched machines and letting any old hippy connect to them was always going to be a security nightmare. But some of the problems faced by those early pioneers are still present today.</p>

<p>Default passwords, unmonitored systems, uninterested law enforcement, dictionary attacks, buggy permissions, the moral quandary of responsible disclosure - it's all in here.</p>

<p>Of course, there are a few bits which look pretty dated now. Especially some of the attitudes to online privacy:</p>

<blockquote><p>“You’re not the government, so you don’t need a search warrant. The worst it would be is invasion of privacy. And people dialing up a computer probably have no right to insist that the system’s owner not look over their shoulder. So I don’t see why you can’t.”</p></blockquote>

<p>It's also nice seeing how internecine warfare between hackers has barely evolved:</p>

<blockquote><p>From long tradition, astronomers have programmed in Fortran, so I wasn’t surprised when Dave gave me the hairy eyeball for using such an antiquated language. He challenged me to use the C language
...
 VI was predecessor to hundreds of word processing systems. By now, Unix folks see it as a bit stodgy—it hasn’t the versatility of Gnu-Emacs, nor the friendliness of more modern editors. Despite that, VI shows up on every Unix system.</p></blockquote>

<p>There's some deep wisdom in there for any programmer to reflect on:</p>

<blockquote><p>If people built houses the way we write programs, the first woodpecker would wipe out civilization.</p></blockquote>

<p>I urge anyone with an interest in computer security to read it. There's a huge amount of entertaining history in there - and plenty of lessons that we still need to learn.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=47417&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2023/10/book-review-the-cuckoos-egg-clifford-stoll/feed/</wfw:commentRss>
			<slash:comments>8</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[What's the most malicious thing you can do with an injected HTML heading element?]]></title>
		<link>https://shkspr.mobi/blog/2022/08/whats-the-most-malicious-thing-you-can-do-with-an-injected-html-heading-element/</link>
					<comments>https://shkspr.mobi/blog/2022/08/whats-the-most-malicious-thing-you-can-do-with-an-injected-html-heading-element/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 30 Aug 2022 11:34:39 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[css]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[Responsible Disclosure]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=42759</guid>

					<description><![CDATA[A bit of a thought experiment - similar to my Minimum Viable XSS and SVG injection investigations.  I recently found a popular website which echoed back user input. It correctly sanitised &#60; to &#38;lt; to prevent any HTML injection.  Except…  It let through &#60;h2&#62; elements unaltered! Why? I suspect because the output was:  &#60;h2&#62;Your search for ... returned no results&#60;/h2&#62;   And, somehow, the parser was g…]]></description>
										<content:encoded><![CDATA[<p>A bit of a thought experiment - similar to my <a href="https://shkspr.mobi/blog/2016/03/minimum-viable-xss/">Minimum Viable XSS</a> and <a href="https://shkspr.mobi/blog/2019/11/responsible-disclosure-svg-injection-in-three-co-uk/">SVG injection</a> investigations.</p>

<p>I recently found a popular website which echoed back user input. It correctly sanitised <code>&lt;</code> to <code>&amp;lt;</code> to prevent any HTML injection.</p>

<p>Except…</p>

<p>It let through <code>&lt;h2&gt;</code> elements unaltered! Why? I suspect because the output was:</p>

<pre><code class="language-html">&lt;h2&gt;Your search for ... returned no results&lt;/h2&gt;
</code></pre>

<p>And, somehow, the parser was getting confused.  OK, what can we do with this little vector?</p>

<p>The first thought is to use Javascript event handlers like <code>onclick()</code> or <code>onmouseover()</code> - but they were (sensibly) blocked.  The <code>&lt;h2&gt;</code> element only has access to the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Global_attributes">Global Attributes</a>. So we could inject content which use Right-To-Left text, or add some metadata attributes - but that's not particularly useful.</p>

<p>The most useful Global Attribute is <code>style=""</code>. Yup! Good old CSS!</p>

<p>The limitation of the style attribute is that it only applies to the specific element it is attached to. So you can't rewrite the entire page. You also can't use the <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/content"><code>content:</code></a> property - as that only applies to <code>::before</code> and <code>::after</code> directives.</p>

<p>Using normal CSS, we can change the colour and size of our newly injected <code>&lt;h2&gt;</code>, faff around with the background colour, change the font, and move it about the page.  Good for a bit of digital graffiti, but not much else.</p>

<p>Except…</p>

<p>What about using <a href="https://developer.mozilla.org/en-US/docs/Web/CSS/background-image"><code>background-image</code></a>? Using that, we can pull in an <em>external</em> resource.</p>

<pre><code class="language-_">&lt;h2
  style="background-image:url('https://evil.site/whatever.png');
  width:512px;
  height:512px;"&gt; ... &lt;/h2&gt;
</code></pre>

<p>That will load an external picture on the site. It could be an animated GIF saying "You're a winner! Visit www.... to claim your prize!". It wouldn't be clickable, but might catch a few people out.</p>

<p>It is possible to load an SVG. And <a href="https://shkspr.mobi/blog/2018/02/this-svg-always-shows-todays-date/">SVG can contain JS</a>. But - alas and alack - the JS doesn't run in background mode - even if the JS is bundled as Base64.</p>

<p>Changing the <code>content-disposition</code> of the image won't force the browser to download it, either.</p>

<p>And that, I think, is about the limit of it. If Javascript is blocked, the worst you can do is inject a malicious image. Short of finding a zero-day in a browser's codec, all that can happen is a bit of temporary defacement.</p>

<h2 id="but-wait-theres-more"><a href="https://shkspr.mobi/blog/2022/08/whats-the-most-malicious-thing-you-can-do-with-an-injected-html-heading-element/#but-wait-theres-more">But Wait! There's More!</a></h2>

<p>While fuzzing around with the input, I made an interesting mistake.  I mistyped <code>&lt;svg&gt;</code> as <code>&lt;sgv&gt;</code>.  That invalid element <em>was</em> added to the page's HTML!  That means there's a parser somewhere which is stripping out only the elements it knows about.  Browsers typically ignore elements they don't understand - so there's no danger to users there. But it points to the idea that there may be some elements the sanitiser doesn't know about.</p>

<p>And, indeed, there were!  For example, it happily took the <a href="https://developer.mozilla.org/en-US/docs/Web/HTML/Element/plaintext">obsolete <code>&lt;plaintext&gt;</code> element</a>, and dumped it into the markup.  Which caused the page to break.</p>

<p>It also, delightfully, took the <code>&lt;marquee&gt;</code> element!</p>

<style>.social-embed{all:unset;display:block;}.social-embed * {all:unset;display:revert;}.social-embed::after{all:unset;}.social-embed::before{all:unset;}blockquote:not(*){all:unset;}.social-embed a{cursor:pointer;}blockquote.social-embed{box-sizing:border-box;border:.5px solid;width:550px;max-width:100%;font-family:sans-serif;margin:auto;margin-bottom:.5em;padding:1em;border-radius:1em;background-color:#FFF;color:#000;display:block;}.social-embed-header{display:flex;justify-content:space-between;}.social-embed-user{display:flex;position:relative;align-items:center;text-decoration:none;color:inherit;}.social-embed-avatar{width:3em;height:3em;margin-right:.5em;}.social-embed-avatar-circle{border-radius:50%;}.social-embed-avatar-square{border-radius:5%;}.social-embed-user-names-name{display:flex;align-items:center;font-weight:bold;margin:0;}.social-embed-text{margin-top:.5em;}.social-embed-footer{display:flex;align-items:center;justify-content:space-between;}.social-embed-logo{width:3em;}.social-embed-hr{border:.1px solid;margin:.5em 0 .5em 0;}.social-embed-meta{text-decoration:none !important;color:unset !important;}.social-embed-reply{display:block;}.social-embed-text a, .social-embed-footer time{color:blue;text-decoration:underline;}.social-embed-media, .social-embed-video{border-radius:1em;max-width:100%;margin:auto;display:block;}.social-embed-reply{font-size:.75em;display:block;}.social-embed-meter{width:100%;background:#0005;}.social-embed-card{text-decoration:none !important;color:unset !important;border:.5px solid;display:block;font-size:.85em;padding:.5em;border-radius:1em;}</style>

<blockquote class="social-embed" id="social-embed-1533201088941285377" lang="en"><header class="social-embed-header"><a href="https://twitter.com/edent" class="social-embed-user"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt=""><div class="social-embed-user-names"><p class="social-embed-user-names-name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="" src="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciCmFyaWEtbGFiZWw9IlR3aXR0ZXIiIHJvbGU9ImltZyIKdmlld0JveD0iMCAwIDUxMiA1MTIiPjxwYXRoCmQ9Im0wIDBINTEyVjUxMkgwIgpmaWxsPSIjZmZmIi8+PHBhdGggZmlsbD0iIzFkOWJmMCIgZD0ibTQ1OCAxNDBxLTIzIDEwLTQ1IDEyIDI1LTE1IDM0LTQzLTI0IDE0LTUwIDE5YTc5IDc5IDAgMDAtMTM1IDcycS0xMDEtNy0xNjMtODNhODAgODAgMCAwMDI0IDEwNnEtMTcgMC0zNi0xMHMtMyA2MiA2NCA3OXEtMTkgNS0zNiAxczE1IDUzIDc0IDU1cS01MCA0MC0xMTcgMzNhMjI0IDIyNCAwIDAwMzQ2LTIwMHEyMy0xNiA0MC00MSIvPjwvc3ZnPg=="></header><section class="social-embed-text"><small class="social-embed-reply"><a href="https://twitter.com/edent/status/1533197758299086849">Replying to @edent</a></small>OMG…!<br>I legit did not expect that to work… <a href="https://twitter.com/edent/status/1533201088941285377/video/1">pic.x.com/5q4ymmzjdg</a><video class="social-embed-video" controls="" src="https://video.twimg.com/ext_tw_video/1533201033920450560/pu/vid/1280x718/0Ysl5rTjzywBh64K.mp4?tag=12" poster="data:image/webp;base64,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" width="550"></video></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1533201088941285377" aria-label="10 likes" class="social-embed-meta">❤️ 10</a><a href="https://twitter.com/edent/status/1533201088941285377" aria-label="0 replies" class="social-embed-meta">💬 0</a><a href="https://twitter.com/edent/status/1533201088941285377" aria-label="0 retweets" class="social-embed-meta">♻️ 0</a><a href="https://twitter.com/edent/status/1533201088941285377"><time datetime="2022-06-04T21:36:39.000Z">21:36 - Sat 04 June 2022</time></a></footer></blockquote>

<p>I reported the issue immediately, and got an acknowledgement. But, sadly, after a few months the website was still not fixed.</p>

<p>Take a bow, <a href="https://dl.acm.org/action/doSearch?AllField=%3Cmarquee%3EWhoops%21">ACM Digital Library!</a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=42759&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2022/08/whats-the-most-malicious-thing-you-can-do-with-an-injected-html-heading-element/feed/</wfw:commentRss>
			<slash:comments>3</slash:comments>
		
		<enclosure url="https://video.twimg.com/ext_tw_video/1533201033920450560/pu/vid/1280x718/0Ysl5rTjzywBh64K.mp4?tag=12" length="163170" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[Certified in The Art of Hacking - Day 5]]></title>
		<link>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-5/</link>
					<comments>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-5/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 05 Nov 2021 12:34:51 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Certified in The Art of Hacking]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[MSc]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[xss]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=40794</guid>

					<description><![CDATA[This is a diary of what I&#039;ve learned. Hopefully it will let other learners know what the course is like, and if it is worthwhile. Oh, and it might just help me remember what I&#039;m learning!  Verdicts  Some of the lab tasks were impossible without looking at the cheat sheet. I got stuck on one because the question told me to go to one URl, but I had to guess the one which was vulnerable. Felt like a …]]></description>
										<content:encoded><![CDATA[<p>This is a diary of what I've learned. Hopefully it will let other learners know what the course is like, and if it is worthwhile. Oh, and it might just help me remember what I'm learning!</p>

<h2 id="verdicts"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-5/#verdicts">Verdicts</a></h2>

<p>Some of the lab tasks were impossible without looking at the cheat sheet. I got stuck on one because the question told me to go to one URl, but I had to guess the one which was vulnerable. Felt like a bit of a "gotcha" moment. Perhaps in a proper lab environment it might have made more sense - but because we're mostly just learning how to use tools, I wasn't really prepared to use my critical thinking skills!</p>

<p>Only a half day, again. Good discussion of XSS and CSRF - but only a surface discussion of what they can do and how to prevent them.  That's the problem with these sorts of courses - they can only say "sanitise user input", they can't <em>explain</em> how to do it for every environment.</p>

<p>SQL Injection. Good length of session. The standard Little Bobby Tables joke. And quite focused on Burp Suite and SQLMAP. A small bit on preventing them with parametrised queries.</p>

<p>CIA triad was briefly mentioned - but not really discussed. I would have expected more on that as it is fairly fundamental.</p>

<p>XXE. Malicious XML files. Billion Laughs Attack was (very) briefly covered.</p>

<p>Web shells from insecure file upload. A few tricks on how to fool UGC checkers. But not too much on defending.</p>

<p>The object serialisation stuff seemed a bit obscure. Not sure how relevant that is to the real world - but interesting none the less.</p>

<p>In the end, my overall verdict is that this is a good practical course. But because it covers so much, and spends so long setting up environments, it only gives a brief overview. It's rather geared towards specific tools - and that means lots of syntax memorisation for the exam.</p>

<h2 id="the-exam"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-5/#the-exam">The Exam</a></h2>

<p>I <strong>fucking hate</strong> exams. There are very few times in life where you have a hard deadline, no one to help, and no ability to consult external sources.</p>

<p>Because of the intrusive spyware used on their proctoring system (more on that tomorrow), I'm going to have to go to a test centre to take the exam.</p>

<p>The exam gives 70 minutes to complete 50 multiple choice questions. 50% needed for a pass mark. That seems achievable. But it really depends on how many Windows questions there are, and how many ask me to precisely remember command line options.</p>

<p><a href="https://xkcd.com/1168/"><img src="https://imgs.xkcd.com/comics/tar.png" width="713" height="229" alt="XKCD comic.     [Megan and White Hat stand next to a nuclear bomb. The bomb has a hatch open on top, and a small blinking screen. The two people are shouting off-screen.]     Megan: Rob! You use Unix!     White Hat: Come quick!      [Megan, White Hat, and Rob look at the screen on the bomb. Rob peers closely. The screen is on the bomb, but is shown at the top of the panel in black with white letters, except " tar"="" and="" the="" last="" underscore="" which="" is="" in="" gray="" "ten"="" black="" but="" written="" a="" white="" box.="" text="" reads:]="" to="" disarm="" bomb,="" simply="" enter="" valid="" tar="" command="" on="" your="" first="" try.="" no="" googling.="" you="" have="" ten="" seconds.="" ~#="" _="" [they="" all="" stand="" same="" position,="" without="" displayed.="" beat="" panel.]="" [still="" position="" hat="" becomes="" impatient.]="" hat:="" ...rob?="" rob:="" i'm="" so="" sorry."="" class="aligncenter size-medium"></a></p>

<h2 id="practice-questions"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-5/#practice-questions">Practice questions</a></h2>

<p>The first time I scored 10/10. I know this stuff ☺</p>

<ol>
<li>John has run dirbuster against a target website looking for possible pages to investigate and receives the following results. What does the 401 response mean?

<ul>
<li>HTTP 401 response means that the page is not available</li>
<li>HTTP 401 response means that the server has returned an internal error</li>
<li>HTTP 401 response means that the client should use the version in its cache</li>
<li>HTTP 401 response means that the resource is available, but requires authentication credentials to be able to be accessed</li>
</ul></li>
<li>What port does BurpSuite use by default?

<ul>
<li>80</li>
<li>4444</li>
<li>8888</li>
<li>8080</li>
</ul></li>
<li>What file is commonly used to inform search engines about the folders/files they are forbidden to index?

<ul>
<li>robots.txt</li>
<li>index.html</li>
<li>search.csv</li>
<li>spider.txt</li>
</ul></li>
<li>Sally wishes to retrieve all the pdf documents from targetsite.com. Which of the following Google Dorks would satisfy that demand?

<ul>
<li>intitle:index_of *.pdf location:targetsite.com</li>
<li>site:targetsite.com filetype:pdf</li>
<li>pdf domain:targetsite.com</li>
<li>targetsite.com filetype:pdf</li>
</ul></li>
<li>Connor is experimenting with a XSS vulnerability on a website. He uploads the following script but gets no response. What is the issue here? <code>&lt;script&gt;alert(XSS);&lt;/script&gt;</code>

<ul>
<li>The syntax should be <code>&lt;script&gt;alert("XSS");&lt;/script&gt;</code></li>
<li>The syntax should be <code>&lt;script alert("XSS); /&gt;</code></li>
<li>syntax should be <code>&lt;script&gt;alert="XSS";&lt;/script&gt;</code></li>
<li>syntax should be <code>&lt;script&gt;display.alert("XSS");&lt;/script&gt;</code></li>
</ul></li>
<li>Fiona has identified a vulnerable web app that allows her to perform SQLi. She wants to identify what database is behind the web app. What SQLi command would allow Fiona to get this data?

<ul>
<li>SELECT @@information_schema --</li>
<li>@@version --</li>
<li>@@database --</li>
<li>@@schema--</li>
</ul></li>
<li>Jonas has identified a vulnerable web app that allows SQLi. He is using SQLMap to explore the system. What command should Jonas use to enumerate the available databases on the server?

<ul>
<li>--database</li>
<li>--layout</li>
<li>--dbs</li>
<li>--db</li>
</ul></li>
<li>Which of the following file uploads should you prohibit if you wanted to ensure no-one can upload malicious files to your webserver?

<ul>
<li>file.asp:.jpg</li>
<li>file.php.jpg</li>
<li>php%00.jpg</li>
<li>All of them</li>
</ul></li>
<li>True or False, SSL v3.0 offers better encryption than TLS v1.2

<ul>
<li>True</li>
<li>False</li>
</ul></li>
<li>Complete the sentence... HTTP is classed as a ________ protocol

<ul>
<li>secure</li>
<li>stateless</li>
<li>web 2.0</li>
<li>dynamic</li>
</ul></li>
</ol>

<h2 id="notes"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-5/#notes">Notes</a></h2>

<p>XSS. Recap. Can be from HTTP headers, cookies, and other weird things - not just GET.  Can persist on the server.</p>

<p>Impact - phishing, hijack cookies, use browser exploitation, BitCoin mining.</p>

<p>Bug bounties available.</p>

<p>How <em>not</em> to prevent. Don't use blacklist regex - easy to bypass. XSS can work without script tags, eg onmouseover. UTF-7 encoding, URL encoding.</p>

<p>CSRF - cross site request forgery. Not stealing cookies and credentials. Force the user's browser to connect to a previously authorised site. Session Riding or Confused Deputy.  Eg craft a link which forces the user to change their password on a different site. Relies on predictable patterns. Use of random tokens per request - which are then verified.  Tokens shouldn't be reusable.</p>

<p>SQL injection. Can take input from the user, no filtering, pass requests directly to the DB. Good way to exfiltrate data - or even destroy it. Use of single quotes, boolean operators, balancing syntax.</p>

<p>Error based SQLi - see the stack trace etc from error messages. UNION operator - concatenate multiple queries - first legit, 2nd malicious. Blind - you can't see the results. Time Based - if my request is OK, sleep for 5 seconds. Out of Band - rare, depends of privileges being enabled when they shouldn't be.</p>

<p>String vs integer.</p>

<p><code>Select X from Y where Z UNION SELECT @@version--</code></p>

<p>Metadata table - <code>information_schema</code></p>

<p>Pentest Monkey cheat sheets.</p>

<p>Concatenate results.</p>

<p>UDF - user defined functions to run code on machine. Local File Access. Create web shell by browsing to maliciously uploaded code.</p>

<p>Use of ASCII values rather than quoted strings. Blind injection - observe the difference in what is returned by a true or false query.</p>

<p>Principle of least privilege. Make sure the website can only read. A separate trusted process to write. <code>root</code> and <code>sa</code>(?) shouldn't be enabled from the web.</p>

<p>SQLMAP tool. Use of, find vulns, get tables, set up proxy to Burp.</p>

<p>Defend using input validation - blocklists not enough. Paramatise the SQL. ORM(?) Object-relational-mapping Frameworks. Principle of Least Privilege. Don't roll your own!</p>

<p>CIA (Confidentiality, Integrity, Availability)</p>

<p>XXE to get <code>/etc/passwd</code> - weakly configured XML parser. Anything which accepts user-created XML could be vulnerable. Very common on SOAP.</p>

<p>Insecure file upload. Get Web Shell. Filenames can have XSS. Distribute malware or warez.</p>

<p>%00 null byte to avoid extension check <code>file.php%00.jpg</code></p>

<p>Change content type header - send a .php file as image/jpg. Fiddle with magic bytes. <code>malicious.asp;jpg</code> on IIS. Or <code>file.php.jpg</code></p>

<p>WebDAV and Put might be available.</p>

<p>WebShell provides a web interface to the OS level commands. What context are you running in? Might not be root. Upload and download. Execute SQL. Kali stores them in <code>/usr/share/webshells</code></p>

<p>C99 Shell - and other tools. Hacking tools are often backdoored. The creator has access to the shell you've created.</p>

<p>EICAR test to see if anti-malware is running. Change MiMe type when uploading. Is JS checking for file types?</p>

<p>Validate headers and MIME. Check file size. Don't rely on client side - always server side. Only upload to web root. Rename files after upload. Upload to temporary, then virus scan. Change the extension. Restrict folder permissions.</p>

<p>Serialise / Deserialise.</p>

<p>Take PHP, serialise it to an object. PHP warms of passing untrusted user input to unserialize. JSON is better than serialised objects.  Must use magic method to attack (??) eg <code>__construct()</code> Trying to force the server to gadget chain??</p>

<p>pickle.load in Python. Marshal.load() in Ruby. Allow list for the things you want to serealised. Some firewalls</p>

<p>Use <code>!ENTITY</code> (variables). Inject external XML files.  Calls to SMB servers to get NTLM hashes. Then SMBRelay to pass the hash. Using PSexec. Back to Windows ☹. Disable XXE in the parser - or have very strict allow-lists.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=40794&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-5/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Certified in The Art of Hacking - Day 4]]></title>
		<link>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-4/</link>
					<comments>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-4/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 04 Nov 2021 20:57:10 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Certified in The Art of Hacking]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[MSc]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=40792</guid>

					<description><![CDATA[This is a diary of what I&#039;ve learned. Hopefully it will let other learners know what the course is like, and if it is worthwhile. Oh, and it might just help me remember what I&#039;m learning!  The penultimate day. Try not to worry about the upcoming exam!  Today was lots of HTTP, TLS, and other low-ish level stuff like that. But mostly focussed on common website attacks.  Verdict  Bit of a repeat of…]]></description>
										<content:encoded><![CDATA[<p>This is a diary of what I've learned. Hopefully it will let other learners know what the course is like, and if it is worthwhile. Oh, and it might just help me remember what I'm learning!</p>

<p>The penultimate day. Try not to worry about the upcoming exam!</p>

<p>Today was lots of HTTP, TLS, and other low-ish level stuff like that. But mostly focussed on common website attacks.</p>

<h2 id="verdict"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-4/#verdict">Verdict</a></h2>

<p>Bit of a repeat of yesterday's Windows session to make up for the broken labs. The exam requires 50% right answers to pass - so I feel quite relaxed if I fail the Windows portion. I reckon I should be about to get a few correct questions either by guesswork or memorising metasploit commands. With a bit of luck, I'll never have to interact with Windows in my professional life!</p>

<p>Painful start trying to get half-a-dozen students to correctly configure Burp suite. Sort of thing which either needs to be built into the labs, or have fool-proof instructions.</p>

<p>Discussion of OWASP - but only up to 2017. Lots of the stuff is a bit outdated. Tutor seemed to think the 2021 Top 10 was only in draft...</p>

<p>There was a good demo website to attack <a href="https://web.archive.org/web/20211218081412/http://notsosecureapp.com/">NotSoSecureApp.com</a> - lots of playing around with Burp and DirBuster.</p>

<p>Again, only a short bit on mitigation. I think that would have been more useful for the target audience.</p>

<p>And, again, lots of trivia. There was one slide on Certificate Authorities. What could have been an interesting discussion on how they work and their weaknesses, was reduced to "they exist".</p>

<p>Similarly - there's an attack called POODLE. What is it? How does it work? Can it be defended against? Nothing.</p>

<p>But, overall, good. It was really focussed on Burp and SSLscan - just learning the tools rather than the underlying problems.</p>

<h2 id="practice-questions"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-4/#practice-questions">Practice Questions</a></h2>

<p>From the Windows session. Through guesswork, I got 7/10.</p>

<ol>
<li>What Windows service typically uses UDP port 5353? (This question was wrong. Should be 5355.)

<ul>
<li>Kerberos</li>
<li>LLMNBR</li>
<li>NBTNS</li>
<li>NetBIOS</li>
</ul></li>
<li>Responder is often used with the -f switch, but what does that switch do?

<ul>
<li>Perform DNS lookups</li>
<li>Enables fast mode</li>
<li>Responds with false answers to DNS lookups</li>
<li>Enables fingerprinting of hosts that issue LLMNR queries</li>
</ul></li>
<li>James has run the nbtstat command against a device and receives a code 1C. what does this code denote?

<ul>
<li>The machine is a File Server Service</li>
<li>The machine is a Domain Master Browser</li>
<li>machine is a Workgroup member</li>
<li>machine is a Domain Controller</li>
</ul></li>
<li>What does the RID value 502 denote?

<ul>
<li>The account is an administrator account</li>
<li>The account is a guest account</li>
<li>The account is a bespoke user account</li>
<li>The account is a Kerberos Key Distribution service</li>
</ul></li>
<li>A common command when using PowerShell is the IEX command. What does IEX stand for?

<ul>
<li>IEX is an alias for Invoke-Expression</li>
<li>IEX stands for Import Executable</li>
<li>IEX stands for Interactive Executable</li>
<li>IEX is an alias for Import-External module</li>
</ul></li>
<li>Simon has PowerShell capabilities on a Windows 10 device and wants to record details about the default program installation paths, etc. What command should Simon use?

<ul>
<li><code>Get-ChildItem env:</code></li>
<li><code>ComputerInfo</code></li>
<li><code>System</code></li>
<li><code>AppvStatus</code></li>
</ul></li>
<li>Carl has attempted to run enum4linux against a Windows host device and has received the following error message: <code>Couldn't get SID: NT_STATUS_ACCESS_DENIED. RID cycling not possible</code>. What is the most likely cause of this error message?

<ul>
<li>The host isn't a Windows host</li>
<li>Carl needs to run enum4linux with the -NT switch</li>
<li><code>RestrictAnonymous</code> registry key on the host is most likely set to 1</li>
<li><code>RestrictAnonymous</code> registry key on the host is most likely set to 0</li>
</ul></li>
<li>Sandra has access via PowerShell to a Windows 10 host and wants to enumerate the machine to try to identify those users who are members of the Domain Admins group. What does she need to do to do in order to get this information?

<ul>
<li>Import the Microsoft.ActiveDirectory,Management.dll and then run <code>Get-ADGroupMember -identity "Domain Admins"</code></li>
<li>Import the Microsoft.ActiveDirectory,Management.dll and then run <code>Get-ADGroup -identity "Domain Admins"</code></li>
<li>Use the Get-SmbShare command to access the $IPC share on the domain controller and then run <code>Get-GroupMember -Identity "Domain Admins"</code></li>
<li>Run the <code>Get-DomainAdmins</code> command</li>
</ul></li>
<li>Vernon has downloaded a ps1 file he wrote from his server to a Windows Server device, and now wishes to execute the file. What should he check before attempting to run the script?

<ul>
<li>The ExecutionPolicy should be checked to allow Vernon to run the unsigned script which has been downloaded from the Internet</li>
<li>That the PowerShell service has been started</li>
<li>That windows bitlocker is disabled</li>
<li>That he is an administrator</li>
</ul></li>
<li>James has gained access to a Windows network and has enumerated a device for SIDs. He has received the following 4 SIDs:
<code>S-1-5-21-2000478354-1708537768-1957994488-500</code>
<code>S-1-5-21-2000478354-1708537768-1957994488-502</code>
<code>S-1-5-21-2000478354-1708537768-1957994488-1000</code>
<code>S-1-5-21-2000478354-1708537768-1957994488-1001</code>

<ul>
<li>Which of the SIDs is identified as the default admin account?</li>
</ul></li>
</ol>

<h2 id="notes"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-4/#notes">Notes</a></h2>

<p>HOSTS file manipulation</p>

<p>Basics of HTTP. Statelessness. Requests. Headers. User Agents.</p>

<p><code>curl -v -X TRACE http://www.example.com</code></p>

<p>Intro to Burp. Would have been better off watching <a href="https://www.youtube.com/embed/nECt-0zW0O4">https://www.youtube.com/embed/nECt-0zW0O4</a></p>

<p>DirBuster. Automated finding of common directories</p>

<p>Passive Scanning with Google.</p>

<p>Bug Bounties (!)</p>

<p>Useful info - defaults, directories, plugins, cms, server version, error messages. Extra methods like WebDAV being enabled.</p>

<p>Google "Dorks" - search for filetypes and common patterns.</p>

<p>2FA, authentication, OAuth.</p>

<p>GitHub info leakage.</p>

<p>OWASP cheat sheet.</p>

<p>Base64 basic auth. Digest MD5. NTLM.</p>

<p>Username enumeration. Login error messages can leak info.</p>

<p>Burp intruder - generates lots of server side logs.  Intruder to iterate through usernames and passwords.</p>

<p>Password strength, HaveIBeenPwned. Password recovery. Stored hashed and salted. Poor account recovery questions like Mother's Maiden Name,</p>

<p>Increase security means reduced usability.</p>

<p>Use of <code>sslscan</code> to look for SSL/TLS errors.</p>

<p>Hash collisions. Store above SHA1. Token expiration times and reuse.</p>

<p>Don't store sensitive info in logs etc.</p>

<p>TLS to encrypt in transit.  How to share keys? Diffie-Helman!</p>

<p>AES for symmetrical.</p>

<p>TLS stages - asym to start, then sym.  Certificate authorities issue certs and validate them.</p>

<p>SSL is obsolete. TLS1.1 also obsolete.  Disable old ones. Cupers &gt; 128 bit.</p>

<p>Vertical attack - standard user elevating themselve. Horizontal - accessing someone else's info. Business logic attacks.</p>

<p>Parameter tampering.</p>

<p>WebScarab to check entropy of cookies. Session fixation - copy cookies to get access. Session ID in URl. Can be resused to get access. Use POST for those requests.</p>

<p>Basics of XSS. Reflected (sent by user). Stored (on server). Header manipulation.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=40792&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-4/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Certified in The Art of Hacking - Day 3]]></title>
		<link>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-3-2/</link>
					<comments>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-3-2/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Wed, 03 Nov 2021 20:53:19 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Certified in The Art of Hacking]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[MSc]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[windows]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=40790</guid>

					<description><![CDATA[This is a diary of what I&#039;ve learned. Hopefully it will let other learners know what the course is like, and if it is worthwhile. Oh, and it might just help me remember what I&#039;m learning!  Day 3 - the day I was dreading most of all… Windows!  I&#039;ve been avoiding M$ WinDoze (LOL!!!) since long before it was fashionable. Even at my earliest jobs, I&#039;d find a way to convince the IT department to let m…]]></description>
										<content:encoded><![CDATA[<p>This is a diary of what I've learned. Hopefully it will let other learners know what the course is like, and if it is worthwhile. Oh, and it might just help me remember what I'm learning!</p>

<p>Day 3 - the day I was dreading most of all… Windows!</p>

<p>I've been avoiding M$ WinDoze (LOL!!!) since long before it was fashionable. Even at my earliest jobs, I'd find a way to convince the IT department to let me run Linux on their kit. I'm penguin-powered, baby!</p>

<p>So, what can an Ubuntu toting geek learn about the gentle art of cracking Windows wide open?</p>

<p>Not much. It was mostly a whistle-stop tour of various Linux tools and a brief explanation of Windows security models.</p>

<h2 id="verdict"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-3-2/#verdict">Verdict</a></h2>

<p>The demo Windows network wasn't working, so all a bit theoretical to start. Once it was up, we had another "script kiddie" day. Run <code>nmap</code>, run <code>enum4linux</code>, run metasploit. Vaguely interesting, but not sure what parts we need to remember for the exam.</p>

<p>Some of the tasks weren't possible unless you had a Windows machine. Most people had a "GoToMyPC" instance they could use - but those of us on Linux machines were basically stuck watching the tutor run some demos.  Lots of memorising of Windows Powershell commands. But, again, no idea if they'll be on the exam.</p>

<p>Some team exercises which was a nice change. I hosted an exploit, another student executed it. But, in the end, the code didn't work. The labs are a bit broken.</p>

<p>Afternoon descended into farce because GoToMyPC went down and lots of students couldn't get back in. Combined with yesterday's inexplicable half-day, meant a lot of confused and frustrated students.</p>

<p>The <a href="https://www.qa.com/course-catalogue/courses/certified-in-the-art-of-hacking-qataoh/?daterange=03%2F11%2F2021%20-%2003%2F11%2F2023&amp;learningMethod=Virtual&amp;">course description</a> was:</p>

<blockquote><p>Unlike [Certified Ethical Hacker], where the focus is to run a tool to achieve an objective which helps attendees pass the exam, we focus on the underlying principles on which tools work and provide attendees an understanding on what is the root cause of the vulnerability and how does the tool work to exploit it. We also talk about how the vulnerability should be mitigated.</p></blockquote>

<p>But, at the moment, it is just running metasploit and a few other tools. Nothing much about the principles. And only a passing comment on how to defend against things.</p>

<p>Similarly, it says:</p>

<blockquote><p>we do not talk about hacking windows XP and 2003 servers (unlike CEH) but talk about circumventing controls in Modern OS such as Windows 2012 / 16 servers. High impact vulnerabilities such and or mass compromise vulnerabilities are taught in the class.</p></blockquote>

<p>Yet there was lots of discussion of Windows 7 and outdated versions of Chrome. Not quite what was advertised.</p>

<p>Turns out the exam <strong>isn't</strong> on Friday. We have a voucher and we can book the exam in the next 12 months. Think I'll take it sooner rather than later - but will give myself enough time to cram and memorise every command line option in existence.</p>

<h2 id="practice-questions-linux-hacking"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-3-2/#practice-questions-linux-hacking">Practice Questions - Linux Hacking</a></h2>

<p>Here are the test questions from yesterday. Once again, it's mostly "can you remember the <em>exact</em> command line without running <code>--help</code> - which I'm not sure is useful. I got 6/10.  This really needs a practical exam. A CTF or similar. Sure, with a bunch of hackers, it could turn into the "Kobayashi Maru" exercise. But that's better than trying to rote learn the command line.</p>

<ol>
<li>Which of the following is NOT an attack against SSL?

<ul>
<li>Heartbleed</li>
<li>POODLE</li>
<li>FREAK</li>
<li>RowHammer</li>
</ul></li>
<li>What is the maximum amount of data retrievable by each Heartbleed heartbeat?

<ul>
<li>64kb</li>
<li>1Mb</li>
<li>512kb</li>
<li>256kb</li>
</ul></li>
<li>True of false, Shellshock affects BASH v 4.4

<ul>
<li>True</li>
<li>False</li>
</ul></li>
<li>Which command allows you to display the full kernel version on a Linux system?

<ul>
<li>cat /etc/kernel</li>
<li>uname -a</li>
<li>echo version</li>
<li>cat /env/kernel</li>
</ul></li>
<li>Jenkins is a popular continuous integration service, often run on Linux servers. What port does Jenkins listen on by default?

<ul>
<li>80</li>
<li>443</li>
<li>666</li>
<li>8080</li>
</ul></li>
<li>True or false - The Jenkins web console is vulnerable to a deserialization attack?

<ul>
<li>True</li>
<li>False</li>
</ul></li>
<li>Simon has managed to obtain a meterpreter shell on a remote Linux machine by exploiting a weak implementation of WordPress. What command should he run to see what user-instance he is using?

<ul>
<li>sysinfo</li>
<li>ps</li>
<li>whoami</li>
<li>getuid</li>
</ul></li>
<li>Rebecca has managed to get a meterpreter payload on a victim machine which is configured with a reverse TCP setting which will attempt to connect to ker Kali machine on 80.17.222.34:4444. She needs to set up a netcat listener on her Kali machine to receive any TCP sessions from the victim machine when the payload is executed. Which of the following commands would do this?

<ul>
<li>nc --listen 4444</li>
<li>nc -nlp 4444</li>
<li>nc -tup 4444</li>
<li>nc -nl 4444</li>
</ul></li>
<li>James has obtained a meterpreter shell on a remote machine but only has restricted user access. He decides to try using a post-exploitation command to try to elevate his privilege level, but he needs to return to his msfconsole prompt to load an auxiliary tool. What command should James use to keep the meterpreter session alive, but allow him to return the msfconsole prompt

<ul>
<li>back</li>
<li>exit</li>
<li>suspend</li>
<li>background</li>
</ul></li>
<li>James has identified a suitable auxiliary command to use in conjunction with an existing meterpreter instance. How can James identify which meterpreter instance to use?

<ul>
<li>session -i</li>
<li>session -l</li>
<li>sessions -l</li>
<li>meterpreter -l</li>
</ul></li>
</ol>

<h2 id="notes"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-3-2/#notes">Notes</a></h2>

<p>netbios - old and unused, should probably be disabled. LLMNR useful is DNS resolution has failed. Generates a lot of sniffable traffic. Can force Windows machines to give up data. Set up a fake server to received the LLMR broadcasts.</p>

<p>Some services are blocked on IPv4 but open on IPv6.</p>

<p>If DNS fails to resolve a host, LLMNR and NBT-NS will ask other hosts in the network if they know the IP address. Net NTLMv2 Challenge response hash is sent by the victim, the fake machine intercepts the hash and can start to crack it. Tell <code>john</code> the <code>--format=netntlmv2</code> to crack it.</p>

<p>If SMB signing is disabled on the target, you can relay the original hash to a new target.</p>

<p>NetBT is netbios over TCP/IP. It does IP to name resolution.  A legacy protocol, should probably be disabled.</p>

<p>EPM is End Point Mapping (?). RPC is Remote Procedure Call (an API?). Bunch of other random acronyms and port numbers.</p>

<p><code>nbtstat</code> on Window, <code>nmblookup</code> on Linux.</p>

<p><code>1c</code> for domain controllers.</p>

<p>Windows enumeration usually on 135, 137 (UDP), 139, 445.  Harder to detect attacks on 135 as it gets lots of traffic. 139 is obsolete from Vista.</p>

<p>Used to be able to connect to InterProcess Communication shares using anon / null session. <code>rpcclient -U "" -N 192.168...</code></p>

<p>Relative Identified - RID. Unique but sequentially assigned. Can cycle through them, RID also identifies role of the user.</p>

<p>SID is the security ID. Primary key for objects in active directory. Unique.  Has relative level, top level authority, the domain, the RID.</p>

<p>RID 500 is Admin, 501 Guest, 502 Kerberos. Everything else 1000+.</p>

<p>RPC can do user to SID and SID to user.  <code>ridenum</code> and <code>enum4linux</code> both good tools for this.</p>

<p>Registry key has restrict anonymous usernames. Can be set to default, don't allow enumeration, no access.</p>

<p>RID cycling over NULL doesn't work on Win 2008+.  If you can do RID cycling with a valid domain user it might leak interesting information.</p>

<p>Use of <code>hash-identifier</code> to see what sort of hash it is. Online services to check weak MD5 hashes.</p>

<p>Once into a Windows machine, use PowerShell as it runs in memory and isn't detected by antivirus. Use GetExecution Policy to change policies. Powershell is case insensitive. Variables start with <code>$</code>. There are per-user preferences. Can declare arrays <code>$a = 1,2,3</code> etc.</p>

<p>To execute <code>Import-Module .\scriptname.ext</code></p>

<p><code>IEX (iwr 'url')</code> to execute a URL??</p>

<p><code>Get-ComputerInfo</code> and <code>Get-ChildIntem env</code> to find out about the target. <code>Get-ADDomainControler</code> to find other stuff.</p>

<p>Open Shares an issue - can allow us to read and write.</p>

<p>Default installations of web apps are often insecure.</p>

<p>Printers are highly trusted, they receive all the hashes, so if you can get in with default credentials you can sniff everything. Printers have LDAP - can start malicious LDAP services.</p>

<p>Use of client side attacks. Use metasploit (again) to host the exploit - get the target to access the metasploit server. Can host malicious web pages, documents with macros. Use Metasploit handler to listen to what's going on. Chrome 72-73 are vulnerable to Array.map, buffer overflow, read arbitrary memory. Chrome must be in <code>--no-sandbox</code></p>

<p>Electron - a shell around Chromium rendering and Node.js runtime - basically a web browser specifically for cross platform apps. Multiple processes.</p>

<p>Joplin, also built on Electron. Can POST to the <code>/notes</code> API to deploy a payload. Can use JS to <code>exec()</code> a local .exe</p>

<p>Looks for Kernel exploits, weak permissions, DLL hijacking etc with <code>post/multi/recon/local_exploit_suggester</code>. Look for PATH environment variable, and place DLLs earlier in the enumeration.</p>

<p>Look for credentials using things like <code>findstr</code> or <code>reg query</code>. Or User Access Controls.</p>

<p>Windows 7 issues. Cleartext creds in memory. No default antivirus. All apps are trusted.</p>

<p>Win10 security features. Device guard - hard and software, locks down device, code integrity, prevents malicious code.
Cred guard. Virtualised, isolates LSASS secrets. Enabled via the registry. Returns encrypted strings rather than NTLM hash.</p>

<p>Local Security Authority (LSA). Prevents memory access to creds.</p>

<p>AMSI - anti malware scan interface. In memory scans for malicious powershell script execution.</p>

<p><code>whoami /priv</code> to see privileges.</p>

<p>winpeas to automate searching.</p>

<p>CVE against things like IE, AppX, allow you to elevate privs.</p>

<p>CVE against cryptoAPI - crypt32.dll allows you to self sign a malicious executable.</p>

<p>RDP vulns.</p>

<p>EternalBlue (ancient!) and Fuzzbunch.</p>

<p>Microsoft COM RCE with device deserialisation flaws.</p>

<p>AMSI can be bypassed via signatures? And ScanBuffer? and C# version? WHAT?</p>

<p>Mimikatz can register a malicious DLL for a Security Support Provider and get creds. Can also bypass LSA.</p>

<p>ColdFusion - lots of exploits. Directory traversal, misconfiguration, default password, FCK Editor - doesn't sanitise input so can upload and execute.</p>

<p>Metasploit web server can bypass AV.</p>

<p>Post exploitation is vital. Once you're in, what can be done? Dump users, password hashes, escalate, pivot (use as a staging post to get further into the network), replay credentials to masquerade as someone else, persistent access, permanent backdoor.</p>

<p>Windows credential vault can store web passwords in plaintext. LSA has logged in user's passwords.</p>

<p>Security Accounts Manager (SAM) - can't be accessed while system is running. Might be able to grab a backup snapshot. Can be accessed on the Domain Controller.</p>

<p>Meterpreter can run hashdump in memory - so AV isn't triggered.</p>

<p>Previous 10 unique logins are cached if DC not available. This is to allow the user to login to the system. Salted hashs. Salt is the username. Encrypted with LSA NL$KM account (??) cachedump can do this.</p>

<p>LSA protected storage for passwords for users and tasks. System privs needed to extract.</p>

<p>LSASS process memory - cleartext passwords for RDP login.</p>

<p>Mimikatz is the main tool for this.</p>

<p>Adding new accounts to Domain Admin group is very noisy - great way to get noticed.</p>

<p>NTLM challenge response. 16 bit challenge, hashed with the user??</p>

<p>Pass the hash</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=40790&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-3-2/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Certified in The Art of Hacking - Day 2]]></title>
		<link>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-2/</link>
					<comments>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-2/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 02 Nov 2021 20:34:47 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Certified in The Art of Hacking]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[MSc]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=40783</guid>

					<description><![CDATA[This is a diary of what I&#039;ve learned. Hopefully it will let other learners know what the course is like, and if it is worthwhile. Oh, and it might just help me remember what I&#039;m learning!  Day 1 was all about password cracking and metasploit. Today? Linux Hacking! Sadly, we aren&#039;t learning anything to do with distributing 1337 cracks for warez (so 1998!).  One point to note is that the questions…]]></description>
										<content:encoded><![CDATA[<p>This is a diary of what I've learned. Hopefully it will let other learners know what the course is like, and if it is worthwhile. Oh, and it might just help me remember what I'm learning!</p>

<p><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/">Day 1</a> was all about password cracking and metasploit. Today? Linux Hacking! Sadly, we aren't learning anything to do with distributing 1337 cracks for warez (<em>so</em> 1998!).</p>

<p>One point to note is that the questions we're set are extremely vague.  Here's a sample:</p>

<blockquote><p>Exploit the HeartBleed vulnerability on 192.168.123.123 to get administrative access to the login interface on the server</p></blockquote>

<p>That doesn't tell me anything about what HeartBleed is, what tools I should be using, or - importantly - what exactly I'll be tested on. Do I need to know the exact sequence of bit to fire at a server? The name of a tool? How it could be defended against?  The teaching slides we have are OK - but make large logical leaps. For example, telling us to run a <code>curl</code> command against a specific path without telling us how we would know about that specific URl.</p>

<h2 id="practice-questions"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-2/#practice-questions">Practice Questions</a></h2>

<p>Got a bit more info about the sort of questions. Mostly trivia really. Some of the topics weren't really discussed yesterday.</p>

<p>Here are the Port Scanning questions.  I was a bit narked to get 50% (a barely passing grade). How well would you do?</p>

<ol>
<li>Sam has scanned a device in his network with nmap, and has identified a service running on port 22. What service should Sam assume this is?

<ul>
<li>FTP</li>
<li>SSH</li>
<li>HTTP</li>
<li>SNMP</li>
</ul></li>
<li>Jackie wants to scan all TCP ports with her nmap scan. What switch will enable Jackie to scan all ports?

<ul>
<li><code>-P</code></li>
<li><code>-p</code></li>
<li><code>-p-</code></li>
<li><code>-A</code></li>
</ul></li>
<li>Simon wants to scan a number of devices in his network with a half-connect scan. What switch should Simon use to accomplish this?

<ul>
<li><code>-sU</code></li>
<li><code>-sT</code></li>
<li><code>-oA</code></li>
<li><code>-sS</code></li>
</ul></li>
<li>If an nmap scan is executed with the -F (fast) switch set, how many ports does nmap scan?

<ul>
<li>The 1st 1000 ports</li>
<li>The first 100 ports</li>
<li>The top 1000 most common ports</li>
<li>The top 100 most common ports</li>
</ul></li>
<li>Which timing switch is more commonly known as the insane mode?

<ul>
<li><code>-T1</code></li>
<li><code>-T5</code></li>
<li><code>-T0</code></li>
<li><code>-T9</code></li>
</ul></li>
<li>James wants to scan the SSH service on his device. Which of the following will allow James to do this?

<ul>
<li><code>-p 22</code></li>
<li><code>-p ssh</code></li>
<li><code>-p T:22</code></li>
</ul></li>
<li>Sandra has run the following scan; what does it do? <code>nmap -Pn -O -sV -oA scan_results 192.168.0.1</code>

<ul>
<li>Performs a ping scan, OS enumeration, Service enumeration, and outputs data to a file called scan_results</li>
<li>Performs a scan of all ports, performs OS enumeration, performs a half-connect scan and outputs results to a file called scan_results</li>
<li>Does not perform any nmap discovery scans, performs an overt scan, a verbose scan and outputs results to a file called scan_results</li>
<li>Does not perform any nmap discovery scans, performs an OS scan, a service enumeration scan, and outputs results to a file called scan_results</li>
</ul></li>
<li>Which of the following outputs is NOT a nmap file output type

<ul>
<li>Normal</li>
<li>Grepable</li>
<li>XML</li>
<li>HTML</li>
</ul></li>
<li>True or False, performing a TCP Half-Connect (-sS) scan required privleges on the scanning computer?

<ul>
<li>True</li>
<li>False</li>
</ul></li>
<li>How many TCP ports does nmap scan by default unless told otherwise?

<ul>
<li>100</li>
<li>1,024</li>
<li>1,000</li>
<li>10,000</li>
</ul></li>
</ol>

<p>Mostly convinced me that most UNIX tools need a better CLI UI!</p>

<p>A DB quiz. Again, mostly trivia. And some stuff not covered. I got 7/9.</p>

<p>Art of Hacking - Database hacking</p>

<ol>
<li>Sarah has scanned a server and has identified a service running on port 3306. What is this service likely to be?

<ul>
<li>MySQL</li>
<li>Postgresql</li>
<li>Microsoft SQL</li>
<li>Mongo DB</li>
</ul></li>
<li>When attacking a MySQL server, which common account should you try to attack that is normally not configured to lockout?

<ul>
<li>Admin</li>
<li>User1</li>
<li>MySQL</li>
<li>Root</li>
</ul></li>
<li>Gary has identified a weakness in a MySQL database installation and has managed to use the database to extract the contents of the /etc/passwd file from the underlying server. what command would Gary have used to do this?

<ul>
<li><code>select LOAD_FILE('/etc/passwd');</code></li>
<li><code>select READ_FILE('etc/passwd');</code></li>
<li><code>select * from /etc/passwd</code></li>
<li><code>select all from FILE('/etc/passwd');</code></li>
</ul></li>
<li>What is the default port for a postgres SQL database?

<ul>
<li>1234</li>
<li>5544</li>
<li>2345</li>
<li>5432</li>
</ul></li>
<li>What is the default user for a postgres SQL database?

<ul>
<li>root</li>
<li>admin</li>
<li>postgres</li>
<li>user0</li>
</ul></li>
<li>James has recovered a set of credentials for a MySQL database running on IP address 192.168.0.43. The credentials he has discovered are: <code>user = root</code> <code>password = P@55w0rd</code>. What syntax should James use to gain access to the database?

<ul>
<li><code>mysql -u root -p P@55w0rd -h 192.168.0.43</code></li>
<li><code>mysql -u root -p -h 192.168.0.43</code></li>
<li><code>mysql -a root -p -u 192.168.0.43</code></li>
<li><code>mysql -u root --password -h 192.168.0.43</code></li>
</ul></li>
<li>David has managed to locate a vulnerable Microsoft SQL database application and wants to find out the version of database in use. What syntax should David use to obtain the version data?

<ul>
<li><code>UNION SELECT @@version --</code></li>
<li><code>SELECT * FROM DB_VERSION #</code></li>
<li><code>VERSION FROM TB_DATABASE WHERE V &gt;1 --</code></li>
<li><code>SELECT * FROM @@version #</code></li>
</ul></li>
<li>What is the name of the file that all databases have that describes the database structure, including database names, table names, column names, and data types, amongst others?

<ul>
<li>DB_STRUCTURE</li>
<li>db_schema</li>
<li>data_definitions</li>
<li>information_schema</li>
</ul></li>
<li>What sqlmap switch would you use to retrieve all the contents from a targeted database table?

<ul>
<li><code>--ALL</code></li>
<li><code>--download</code></li>
<li><code>--dump</code></li>
<li><code>--loot</code></li>
</ul></li>
</ol>

<p>Password questions - again, trivia. I got 7/10 with a few guesses.</p>

<ol>
<li>Kali Linux comes with some pre-installed word lists for use when conducting password attacks. What is the location of these files?

<ul>
<li><code>/usr/share/wordlists</code></li>
<li><code>/var/temp/wordlists</code></li>
<li><code>/usr/wordlists</code></li>
<li><code>/etc/wordlists</code></li>
</ul></li>
<li>What switch should Carl use to provide hydra with a single username to try in an online password attack?

<ul>
<li><code>-L</code></li>
<li><code>-D</code></li>
<li><code>-p</code></li>
<li><code>-l</code></li>
</ul></li>
<li>Denise is trying to use hydra to attack an ftp server which is running on the non-standard port (2121) - what syntax should Denise use when configuring hydra to target this service?

<ul>
<li><code>:2121</code></li>
<li><code>-p 2121</code></li>
<li><code>-s 2121</code></li>
<li><code>p:2121</code></li>
</ul></li>
<li>Joanne has extracted the following data from a Linux server; What hashing algorithm is the system using to generate the password hash? <code>root:$1$/avpfBJ1$x0z8w5UF9Iv./DR9E9Lid.:14747:0:99999:7:::</code>

<ul>
<li>SHA-512</li>
<li>Blowfish</li>
<li>SHA-256</li>
<li>MD5</li>
</ul></li>
<li>What encryption standard did Windows LanMan use to secure its hashes?

<ul>
<li>DES</li>
<li>AES</li>
<li>3DES</li>
<li>RSA</li>
</ul></li>
<li>In order for John-the-Ripper to process Linux passwd &amp; shadow files, they have to be unshadowed first and the results placed into a new file. What is the correct syntax to achieve this?

<ul>
<li><code>unshadow /etc/passwd /etc/shadow &gt; hashfile</code></li>
<li><code>unshadow /etc/shadow /etc/passwd &gt; hashfile</code></li>
<li><code>/etc/passwd /etc/shadow unshadow | hashfile</code></li>
<li><code>unshadow /etc/passwd /etc/shadow | hashfile</code></li>
</ul></li>
<li>What does the "-a0" switch denote when using hashcat?

<ul>
<li>To use only 1 core of the CPU for processing</li>
<li>To output all results to the screen</li>
<li>To use a brute-force attack</li>
<li>To use a dictionary attack</li>
</ul></li>
<li>Which password hashes does Windows salt

<ul>
<li>The SAM file</li>
<li>NTLM hashes</li>
<li>Cached domain hashes</li>
<li>The NTDS.dit file</li>
</ul></li>
<li>Which of the following is not a hash function

<ul>
<li>MD5</li>
<li>Blowfish</li>
<li>SHA-1</li>
<li>RIPEMD-160</li>
</ul></li>
<li>What is the maximum length of a LanMan password

<ul>
<li>14 charters</li>
<li>20 characters</li>
<li>7 characters</li>
<li>32 characters</li>
</ul></li>
</ol>

<h2 id="verdict"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-2/#verdict">Verdict</a></h2>

<p>Lots of students hadn't been exposed to Linux or these tools before. Concern expressed about lots of rote memorisation. All the above questions could be answered with <code>-h</code> - but not able to do that one a proctored exam.</p>

<p>Quite a "script kiddie" day. Lots of loading up metasploit and just guessing until things work.  A few infrastructure problems - broken test servers made things quite frustrating.</p>

<p>Lots of technical jargon without any explanation. Jenkins, Groovy, Sandbox, Metaprogramming. What are they? What definitions are needed for the exam?</p>

<p>Nothing so far about law and ethics… Which is a bit worrying. We're only working on a restricted demo lab, and all the exploits are ancient.</p>

<p>There's still no checking if students have done the tasks. It would be helpful if each student had to, say, retrieve a specific file or string from the target and present it back to the tutor. I know a couple of students who are a bit bewildered but a bit nervous to ask for help.</p>

<p>A short day - so off to Cloud Academy to brush up on my skills.</p>

<h2 id="notes"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-2/#notes">Notes</a></h2>

<p>Heartbleed - get up to 64KB data from memory. Ask for specific length, bounds aren't checked. Only on old versions of TLS. Can also check key length - under 128bit may be vulnerable.</p>

<p>Heartbleed to find username / password. Log in via the web. View source to find .cgi path.</p>

<p>Metasploit - use the right module and configure. Exploit and then <code>cat</code> the <code>/etc/passwd</code> file.</p>

<p>Shellshock - as above. Copy and paste commands.</p>

<p><code>LD_PRELOAD</code> need to ensure you keep privileges.</p>

<p>Use of <code>nc</code> to get remote machine to connect to your machine in order to get a shell on it.</p>

<p>Use of <code>history</code> to check for entered passwords and other interesting bits.</p>

<p>Weak Linux permissions. Can you overwrite a command run by root?</p>

<p><code>cron</code> jobs a good source of this.</p>

<p>Use of local Python server to transfer files across. <code>linpeas.sh</code></p>

<p>Always compile exploits on target machine to ensure architecture compatibility.</p>

<p>Basic use of <code>wget</code> and <code>chmod</code></p>

<p>Exploiting other Linux things like JBoss, Tomcat, Jenkins. What is our attack surface? Weak defaults. Outdated versions with CVE.</p>

<p>Data Serialisation. Can be weaponised into a payload which will be parsed and executed. Tools like CommonsCollections1.</p>

<p>CMS targets like Joomla, Drupal, WordPress. Lots of complexity leads to misconfiguration. Vulnerable plugins and add-ons. Version leakage.</p>

<p><code>joomscan</code> and <code>wpscan</code> both useful automated tools. As are DroopeScan and DruPwn for Drupal</p>

<p>Injection of serialised objects into HTTP_HEADER. Chain with <code>x-forward-for</code> to trigger the payload.</p>

<p>Basics of scanning for unknown ports then running <code>droopescan</code> and <code>wpscan</code>.</p>

<p>EXIF metadata can also be used to hide information - old WP plugins particularly vulnerable.</p>

<p>Use of <code>dirb</code> to find directories on remote webservers.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=40783&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-2/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Certified in The Art of Hacking - Day 1]]></title>
		<link>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/</link>
					<comments>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Mon, 01 Nov 2021 20:34:07 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Certified in The Art of Hacking]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[MSc]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=40780</guid>

					<description><![CDATA[As part of my MSc, I have to take three &#34;Professional Practice&#34; courses. The course provider, QA.com, let me choose anything from their online catalogue.  The first I&#039;m doing is Certified in The Art of Hacking.  As regular readers will know, I&#039;m pretty reasonable at hacking. I have received bug bounties from Google, Twitter, Samsung, and a bunch of others. I don&#039;t claim to be an expert - and I…]]></description>
										<content:encoded><![CDATA[<p>As part of my MSc, I have to take three "Professional Practice" courses. The course provider, QA.com, let me choose anything from their online catalogue.  The first I'm doing is <a href="https://www.qa.com/course-catalogue/courses/certified-in-the-art-of-hacking-qataoh/">Certified in The Art of Hacking</a>.</p>

<p>As regular readers will know, I'm pretty reasonable at hacking. I have received bug bounties from Google, Twitter, Samsung, and a bunch of others. I don't claim to be an expert - and I doubt I'll be on any top-10 lists - but I have a reasonable, albeit informal, background. It's that "informal" which is annoying me. I want a bit of paper which says that, yes, actually, I <em>do</em> know what I'm talking about.</p>

<p>Computer Science - and hackers especially - eschew formal qualifications. The earliest hackers and phreakers learned their craft on the mean streets of the early Infobahn. Geeks don't need qualifications! We're not <em>nerds!</em></p>

<p>But, hey, a free qualification is not to be sniffed at. I know it probably won't be as rigorous as some other certifications - but it was all that was available to me.</p>

<p>Looking through the course agenda there were a few things I knew well - XSS, Port Scanning, Password Hashing - but it's always good to pick up a reminder. 
Some things I've heard of but not used - Burp, Heartbleed, Metasploit - so will be good to get a solid understanding. 
And some things <em>way</em> outside my experience - Windows stuff, Tomcat, XXE - yay new learning!</p>

<p>The thing that I'm looking forward to the least is the exam at the end. It's multiple choice and requires 50% correct - but I always find myself second-guessing those sorts of questions. Especially if there's lots of "well, <em>technically</em>" type questions. Also - concentrating for 70 minutes!!? And proctored? Does that mean I can't run to Wikipedia for help?!?</p>

<p>Anyway, I'm going to try and keep a diary of what I've learned. Hopefully that will let other learners know what the course is like, and if it is worthwhile.</p>

<h2 id="verdict"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#verdict">Verdict</a></h2>

<p>A bit more theory than I was expecting. Diving straight in to TCP flags was a bit alienating for some students - although I already knew about them. Similarly, lots of discussion of ports - but didn't actually explain the fundamentals of what they are.</p>

<p>Lots of terminology thrown at people - so probably not great for complete beginners.</p>

<p>Similarly, the <code>nmap</code> discussion was a bit whistle-stop. It was mostly a case of following the PDF instructions without much explanation. Lots of people (me included!) got tripped up by the command line flags.</p>

<p>Some of the practical exercises were a bit copy-and-paste without much understanding of what was going on.</p>

<p>Not much feedback from students. No one was asked to prove they'd got the right answer.</p>

<p>Crucially - I have no idea what sort of questions are going to be on the exam! Is it the port numbers? The name of tools? The specific syntax?</p>

<p>Had to ask. Turns out will need to remember port numbers, nmap options, etc.</p>

<h2 id="day-1-notes"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#day-1-notes">Day 1 Notes</a></h2>

<p>Started on a poor note - had to use GoToMyPC which doesn't have a Linux client.  The Linux option was use OpenVPN to connect to the provider's infrastructure, and then SSH into a Kali Linux image. Installing your own Kali would also be possible, but you still need to connect to the VPN to "attack" the provided vulnerabilities.</p>

<p>Would have been useful if they gave those instructions beforehand. Wasted half an hour while people worked out what to do.</p>

<p>Brief discussion of password cracking. Looking at HaveIBeenPwned and various top 10 lists.</p>

<p>Basics of the <a href="https://en.wikipedia.org/wiki/Kill_chain#The_cyber_kill_chain">Cyber Kill Chain</a>. Enumerate, identify vulnerabilities, exploit, post-exploit, use privileges, repeat. No real discussion of it, or its shortcomings.</p>

<h3 id="module-1-port-scanning"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#module-1-port-scanning">Module 1 - port scanning</a></h3>

<p>ARP - layer 2 of OSI. Below IPv4. ARP maps hardware MAC to IP. Note - only for IPv4. ARP broadcast can ask machines on a local network for the IP addresses.</p>

<p><code>arp-scan</code> to find the live hosts.</p>

<p>Basics of TCP. 3 way handshake. Flags. Segment Header format. SYN. SYN/ACK. ACK.</p>

<p>Use of Wireshark to examine TCP packets.</p>

<p>UDP - what it is, why it is unreliable, header formats.</p>

<p>Ports - what they are, reserved ports, port state. Basics of <code>netstat</code>.</p>

<p>Basics of <code>nmap</code>. 3 way handshake then <code>RST</code>. Don't need special privileges - handy if you have compromised a machine. Plays by the rules, so less likely to trip firewalls. Slower than a half-open scan, so use <code>-sS</code> for SYN, SYN/ACK, RST. Requires privileges, and might get picked up by Intrusion Detection Systems (IDS).</p>

<p>UDP scan <code>-sU</code>. Requires privileges, sends empty UDP packet to every targeted port. Can send specific data <code>--data</code>. Might be blocked by firewalls. Ports can be filtered.
UDP is often used on VPN, NTP, DNS, SNMP.</p>

<p>Dump to file(s) for later ingestion into metasploit:
<code>nmap -sS -sV -nvv -O 192.168.3.0/24 -oA portscan_tcp</code></p>

<h3 id="module-2-password-attacks"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#module-2-password-attacks">Module 2 - password attacks</a></h3>

<p>Online and offline attacks. Sending repeated requests vs looking though a dumped file.</p>

<p>Enumerate users. What are lockout policies? Admins are often exempt from lockout. Throttle brute-force attempts. Often generates lots of log entries and / or alarms.</p>

<p>Intro to SNMP. UDP 161. 1 &amp; 2c have <em>no</em> auth or encryption. Need to know the "community string" or use manufacturer's default. Public string vs Private string.</p>

<p><code>onesixtyone</code> can bruteforce common strings.</p>

<p>OID values. No real explanation of what they were.</p>

<p><code>snmpwalk -v 1 -c ???? 192.168.?.? &lt;OID&gt;</code> Need to learn that syntax.</p>

<h3 id="attacking-mysql"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#attacking-mysql">Attacking MySQL</a></h3>

<p>Old RCE. SQL Injection. Abusing phpMyAdmin. Brute force. Root user is almost always there and has no lockout.</p>

<p><code>hydra</code> to guess passwords</p>

<p>Once logged in, can use <code>Select LOAD_FILE('/etc/passwd');</code> Or <code>Select * from mysql.user;</code> to get all users.</p>

<p>Quite a good exercise, find a MySQL server via <code>nmap</code>, use <code>hydra</code> to try common passwords, log in, get credit card data and other password info.</p>

<h3 id="chaining"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#chaining">Chaining</a></h3>

<p>Using the above, use <code>nmap</code> to find the <code>ssh</code> port. Use one of the users found and brute force their password.</p>

<p>use <code>ssh -t</code> to exfiltrate data. <code>ssh -t user@192.168.3.123 -p 1234 "cat /etc/passwd"</code></p>

<p>Then brute the postgres user password and get shell using <code>sqlmap -f -d postgres://postgres:password@192.168.3.123:5432/postgres --os-shell</code></p>

<h3 id="metasploit-basics"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#metasploit-basics">Metasploit basics</a></h3>

<p>Loading output of <code>nmap</code> into it.  <code>msfconsole</code>.  Most exploits can be detected by common anti-virus. Use <code>show axillary</code> and <code>show exploits</code> and <code>show payloads</code> to get list.</p>

<p>bind - waits for a response. reverse shell - the machine connects directly to you. Useful for bypassing firewalls.</p>

<p><code>meterpreter</code> is the most advanced payload.</p>

<p>Grepping through metasploit. Getting reverse shell on an IRC (!) server.</p>

<h3 id="cracking-passwords"><a href="https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/#cracking-passwords">Cracking Passwords</a></h3>

<p>MD5, SHA1, LM/NTLM, Blowfish, SHA256, SHA512 hashing etc. Rainbow tables to use offline attacks. Salting etc.</p>

<p>Encoding, encrypting, hashing. Transforming clear text via a reversible algorithm eg Base64. Asymmetric encryption relying on public and private keys. Hashing is a one-way function - usually produces a fixed length string.</p>

<p>Salting - a way to obfuscate the hash.</p>

<p><code>openssl passwd -1 -salt 123 password</code> use MD5 password with salt.</p>

<p>Salt can be cached domain credentials like the username. Unix uses random salt.</p>

<p>LM (LanMan) is an insecure Windows hashing for XP and earlier.</p>

<p>John The Ripper - can brute force per character (slow) or a word list (faster).
<code>unshadow /etc/passwd /etc/shadow &gt; hashes</code>
<code>john --single hashes</code>
<code>john -w=wordlist</code></p>

<p>Hashcat can use a GPU for password cracking.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=40780&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/11/certified-in-the-art-of-hacking-day-1/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[What playing football taught me about hacking - Part 1]]></title>
		<link>https://shkspr.mobi/blog/2021/04/sports-hacks-part-1/</link>
					<comments>https://shkspr.mobi/blog/2021/04/sports-hacks-part-1/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 24 Apr 2021 11:15:54 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[sport]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=38757</guid>

					<description><![CDATA[This is a two-part blog post about rewriting the rules.  I hated playing sports as a teenager quelle surprise. In a vain attempt to get me to love the beautiful game, a PE teacher once made me team captain for a kickabout. My rival? Sporty Dave. Head boy, house captain, and conqueror of puberty.  The PE teacher made us pick our teams. I went first and, naturally, chose the weakest of my…]]></description>
										<content:encoded><![CDATA[<p>This is a two-part blog post about rewriting the rules.</p>

<p>I hated playing sports as a teenager <em>quelle surprise</em>. In a vain attempt to get me to love the beautiful game, a PE teacher once made me team captain for a kickabout. My rival? Sporty Dave. Head boy, house captain, and conqueror of puberty.</p>

<p>The PE teacher made us pick our teams. I went first and, naturally, chose the weakest of my classmates - Fat Derek.  He was overjoyed not to be picked last for once.</p>

<p>"You <em>idiot!</em>" whispered Dave. He picked his mate Phil - who was similarly blessed in the sporting department.</p>

<p>I chose Asthmatic Gary next, while Dave signed up another sporting hero.</p>

<p>And so it went. I assembled a team of wheezers, misfits, and the terminally unfit.  Dave had the cream of the crop - all of whom snickered at us.  We went off to give our teams a pep-talk before kick-off.</p>

<p>"Right lads," I said, "Do any of you actually <em>enjoy</em> playing football?"</p>

<p>They looked around sheepishly and agreed, collectively, that they found the whole experience pretty miserable.</p>

<p>"OK, so here's how we have fun while making the other team feel as crappy as we usually do..."  at which point, in the TV adaptation of my life, the camera pulls out and the sound trails off.</p>

<p>In reality, my plan was simple. Our aim was to help the opposing team score as many goals as possible. If the ball looked like it was coming towards us, we had to sidestep it. If we were ever unlucky enough to be in possession of the ball, we had to pass it to an opposing player.  Whenever they scored a goal, we had to applaud them.</p>

<p>The whistle blew, and we were off.</p>

<p>The opposing team couldn't believe their luck! Goal after goal flowed. By the time we were 5-nil down, the novelty of it had worn off. Once the score was 15-love, Sporty Dave jogged over to me.</p>

<p>"Ummm... Do you think you could play, please?"</p>

<p>"What do you mean?"</p>

<p>"Errr... It just isn't fun doing it like this?"</p>

<p>"I dunno mate," I looked over at my team who were grinning away, "We seem to be having a lot of fun. We're not tired and sweaty, we're not getting pushed, shoved, or humiliated, and we're enjoying helping you win."</p>

<p>"But it doesn't count!" He whined. "It's just too easy."</p>

<p>"You're scoring lots of goals. Isn't that what you wanted?"</p>

<p>"Yes... but..."</p>

<p>"Well then? My team get to be fresh and alert for the double-maths we've got after this. And you get to run around chasing the ball. Let's carry on!"</p>

<p>And so we did.  We rewrote the rules of the game so that <em>we</em> could have fun.  Our idea of fun was radically different from the sporty-boys - but we didn't care.</p>

<p>You don't have to play the same game as other people on the pitch.   Even if you're bound by the same rules of play, you can alter your success criteria to be something that you want to achieve.</p>

<p>We ended the game triumphant. For the first time in living memory, we were happy after PE.  Our rivals, despite their 37 goals, looked miserable and dejected.</p>

<p>They didn't want to win. They didn't even want to play. They wanted to humiliate their rivals.  Once we were no longer able to be humiliated, they found the entire experience as demoralising as we usually did.</p>

<p>After that incident, I was only ever picked to be team captain once more. But that's tomorrow's post.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=38757&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/04/sports-hacks-part-1/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Creating a public, read-only calendar]]></title>
		<link>https://shkspr.mobi/blog/2021/02/creating-an-public-read-only-calendar/</link>
					<comments>https://shkspr.mobi/blog/2021/02/creating-an-public-read-only-calendar/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 04 Feb 2021 12:44:48 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[Open Source]]></category>
		<category><![CDATA[python]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=37965</guid>

					<description><![CDATA[Last year, I blogged about why I make my work calendar public. It is useful to have a public website where people can see if I&#039;m free or busy.  But the version I created relied on Google Calendar which, sadly, isn&#039;t that great. It doesn&#039;t look wonderful, especially on small screens, and is limited to only one calendar feed.  So I used the mighty power of Open Source to build my own! …]]></description>
										<content:encoded><![CDATA[<p>Last year, I blogged about <a href="https://shkspr.mobi/blog/2020/01/why-i-make-my-work-calendar-public/">why I make my work calendar public</a>. It is useful to have a public website where people can see if I'm free or busy.</p>

<p>But the version I created relied on Google Calendar which, sadly, isn't that great. It doesn't look wonderful, especially on small screens, and is limited to only one calendar feed.</p>

<p>So I used the mighty power of Open Source to build my own!  <a href="https://edent.tel/calendar"></a><a href="https://edent.tel/calendar">https://edent.tel/calendar</a>
<a href="https://edent.tel/calendar"><img src="https://shkspr.mobi/blog/wp-content/uploads/2021/02/Screenshot_2021-02-04-edents-calendar.png" alt="A bright and easy to use weekly view of my diary." width="1385" height="740" class="aligncenter size-full wp-image-38044"></a>
It uses two cool components.  First, the <a href="https://dhtmlx.com/docs/products/dhtmlxScheduler/">DHTMLX Scheduler</a> tool - a GPL-licensed project to make beautiful web calendars.</p>

<p>Secondly, <a href="https://github.com/niccokunzmann/open-web-calendar">Open Web Calendar</a> by Nicco Kunzmann. It takes multiple ICS feeds and transforms them into a format suitable for the scheduler.</p>

<p>With a little bit of prodding and poking, I was able to create a responsive web calendar which shows my personal, work, social, and group calendars all at once.</p>

<p>There are a few snags. The project uses Python Flask - which meant learning a new programming paradigm. I might try to rewrite parts of it to use PHP. Because I'm using someone else's code, I've hacked away parts which aren't of use to me - let's hope nothing was load bearing! Similarly, as it's a small personal project, there are no tests. There are a few aesthetic touches I'd like to make - but it is quite serviceable. I also need to set up a better way to deploy it rather than FTP'ing files and restarting Flask.</p>

<p>But, for a weekend of sporadic hacking, I'm quite pleased with the result! The <a href="https://gitlab.com/edent/edent.tel/">code is available on my GitLab</a>.</p>

<h2 id="privacy-and-risks"><a href="https://shkspr.mobi/blog/2021/02/creating-an-public-read-only-calendar/#privacy-and-risks">Privacy and Risks</a></h2>

<p>All the entries on my various calendars are set to private. That means if you send me a meeting invite, your details <em>shouldn't</em> appear on the page.</p>

<p>This co-mingles my personal and work calendars. Because I don't want someone booking a meeting when I've got an evening Zumba class. Is there a risk that you knowing that I'm busy from 19:30 to 21:56 reveals the train journey I'm taking?</p>

<p>If something is in both my personal and work calendar - it shows up as a double booking. Should I merge these?</p>

<p>Could advertisers mine my data to better target me? It's not very granular, and I block adverts.</p>

<p>If someone annoying wants to meet with me, it's harder to fob them off with "my diary's chockablock."</p>

<p>When I jet off to an exotic foreign country (*sobs in pandemic*) will it be obvious what timezone I'm in based on my appointments?</p>

<p>By opening up this data, am I participating in a destructive form of "quantified self"? Will people judge me / themselves on how busy I am?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=37965&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2021/02/creating-an-public-read-only-calendar/feed/</wfw:commentRss>
			<slash:comments>5</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Book Review: Permanent Record ★★⯪☆☆]]></title>
		<link>https://shkspr.mobi/blog/2019/10/book-review-permanent-record/</link>
					<comments>https://shkspr.mobi/blog/2019/10/book-review-permanent-record/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 20 Oct 2019 15:21:42 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[politics]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33011</guid>

					<description><![CDATA[Edward Snowden, the man who risked everything to expose the US government’s system of mass surveillance, reveals for the first time the story of his life, including how he helped to build that system and what motivated him to try to bring it down.  I&#039;m a civil servant in the UK. Luckily, I suppose, I don&#039;t often have access to TOP SECRET information.  I suppose I could leak the canteen&#039;s lunch m…]]></description>
										<content:encoded><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/10/51F8zrObKrL.jpg" alt="Edward Snowden, a geek in glasses, looks away from the camera." width="325" height="500" class="alignleft size-full wp-image-32945">

<blockquote><p>Edward Snowden, the man who risked everything to expose the US government’s system of mass surveillance, reveals for the first time the story of his life, including how he helped to build that system and what motivated him to try to bring it down.</p></blockquote>

<p>I'm a civil servant in the UK. Luckily, I suppose, I don't often have access to TOP SECRET information.  I suppose I could leak the canteen's lunch menu, but that won't make headlines.</p>

<p>What drives a person to jeopardise their career, their family, their life, and - depending on who you believe - their country and its allies?</p>

<p>This is a good book, badly written.</p>

<p>The opening few chapters are a bore. I suspect it's to "prove" he's a genuine, mom-and-apple-pie, red-blooded American. But that's not really why we're here - you can happily skip the first third of the book. I'd recommend skimming from there to about the halfway point.</p>

<p>Even then, it's flabby.  Meandering descriptions which go nowhere. He conflates wasteful public spending with mass surveillance.  There's a page randomly dedicated to what the word "whistle-blower" means in different languages.  And some pedantic nitpicks of what sort of software career he had. It becomes a mish-mash of political ideas and workplace gripes.</p>

<p>The end is spectacular. A gripping description of the emotional and practical side of exfiltrating data and going on the run.</p>

<p>I've seen Snowden speak (via telescreen) at a conference. He's articulate and passionate. His knowledge and persuasive manner make him a fascinating character. But the book feels like half autobiography and half political manifesto - without doing either particularly well.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33011&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/10/book-review-permanent-record/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Book Review: Helpful Hackers ★★★★⯪]]></title>
		<link>https://shkspr.mobi/blog/2019/10/book-review-helpful-hackers/</link>
					<comments>https://shkspr.mobi/blog/2019/10/book-review-helpful-hackers/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sat, 19 Oct 2019 15:03:20 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Book Review]]></category>
		<category><![CDATA[hacking]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=33008</guid>

					<description><![CDATA[The Netherlands is a world leader in responsible disclosure. The Dutch like to resolve conflicts through a process of general consultation: the famous ‘polder model’. In this book, we hear from the hackers, system owners, IT specialists, managers, journalists, politicians and lawyers who have been key players in a number of prominent disclosures. Their stories offer a glimpse into the mys…]]></description>
										<content:encoded><![CDATA[<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/10/Helpful-Hackers-How-the-Dutch-Do-Responsible-Disclosure.jpeg" alt="A locked gate." width="300" class="alignleft size-full wp-image-33004">

<blockquote><p>The Netherlands is a world leader in responsible disclosure. The Dutch like to resolve conflicts through a process of general consultation: the famous ‘polder model’. In this book, we hear from the hackers, system owners, IT specialists, managers, journalists, politicians and lawyers who have been key players in a number of prominent disclosures. Their stories offer a glimpse into the mysterious world of cyber security, revealing how hackers can help us all.</p></blockquote>

<p>A short but essential volume. A pleasing ramble through Dutch infosec and how they built up a culture of responsible disclosure.  Lots of great examples of where things have gone well - and some shocking examples of where disclosure has failed.</p>

<p>It's a well written look at what happens when a <em>responsible</em> security researcher finds a vulnerability. There are court cases, intrigue, international diplomacy, and some spectacularly inept decisions on display.</p>

<p>It is, by its nature, a little parochial - but provides an excellent template for how industry can work with "freelance infosec professionals".</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=33008&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/10/book-review-helpful-hackers/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Who can I hire to hack me?]]></title>
		<link>https://shkspr.mobi/blog/2019/03/who-can-i-hire-to-hack-me/</link>
					<comments>https://shkspr.mobi/blog/2019/03/who-can-i-hire-to-hack-me/#respond</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 31 Mar 2019 11:59:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[opsec]]></category>
		<category><![CDATA[security]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=31821</guid>

					<description><![CDATA[I use a password manager. I have 2FA set up on everything. When an organisation asks me to set a recovery question, I generate a 32 character passphrase. I don&#039;t use my mother&#039;s maiden name or my first pet&#039;s birthday on anything sensitive. I monitor my email addresses for breaches, and I regularly check my credit file.  I&#039;m doing everything a geek can to protect their online life.  Is it enough?  …]]></description>
										<content:encoded><![CDATA[<p>I use a password manager. I have 2FA set up on <em>everything</em>. When an organisation asks me to set a recovery question, I generate a 32 character passphrase. I don't use my mother's maiden name or my first pet's birthday on anything sensitive. I monitor my email addresses for breaches, and I regularly check my credit file.</p>

<p>I'm doing everything a geek can to protect their online life.  Is it enough?</p>

<blockquote class="social-embed" id="social-embed-1111943757233078272" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">Is there a market / service for *personal* pen-testing or social engineering?<br><br>I like to think I've got all my security set up. But how easily could a fraudster take over my life?</section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/1111943757233078272"><span aria-label="43 likes" class="social-embed-meta">❤️ 43</span><span aria-label="16 replies" class="social-embed-meta">💬 16</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2019-03-30T10:50:25.000Z" itemprop="datePublished">10:50 - Sat 30 March 2019</time></a></footer></blockquote>

<p>This is not an invitation to hack me. I'd like to pay a professional to see how far they can infiltrate my online life.  Is my bank particularly vulnerable to social engineering? Does my hosting provider accept a fax to transfer away my domains? Is an image of my passport floating around the dark web? What <abbr title="Open Source Intelligence (OSINT) is the collection and analysis of information that is gathered from public, or open, sources.">OSINT</abbr> should I be scrubbing from the web?</p>

<p>I've got <a href="https://shkspr.mobi/blog/2017/11/how-do-you-move-out-of-a-smarthome/">a stupid amount of smarthome tech</a> - and I know there's <a href="https://security.stackexchange.com/questions/118483/how-to-design-a-home-network-for-iot-devices">no way to secure my network</a> - but I imagine that's a target for someone more dedicated than a casual thief.</p>

<p>I can find pentesting services for companies. I can find some which claim to test the security of CEOs and celebrities. But I can't find anything for ordinary people.</p>

<p>Does this service exist? If not, is this a million-dollar start-up idea?</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=31821&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/03/who-can-i-hire-to-hack-me/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Tado API Guide - updated for 2019]]></title>
		<link>https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/</link>
					<comments>https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Thu, 14 Feb 2019 12:22:17 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[IoT]]></category>
		<category><![CDATA[Smart Home]]></category>
		<category><![CDATA[tado]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=31397</guid>

					<description><![CDATA[Tado is a brilliant smart thermostat. But their API is very poorly documented. This is an updated guide for 2019.  I am indebted to Stephen C Phillips&#039; original documentation.  Getting started  You will need:   A Tado (duh!) Your Username (usually your email address) Your Password A Client Secret   Getting the client secret  I&#039;m using this client secret:…]]></description>
										<content:encoded><![CDATA[<p>Tado is a brilliant smart thermostat. But their API is very poorly documented. This is an updated guide for 2019.  I am indebted to <a href="http://blog.scphillips.com/posts/2017/01/the-tado-api-v2/">Stephen C Phillips' original documentation</a>.</p>

<h2 id="getting-started"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#getting-started">Getting started</a></h2>

<p>You will need:</p>

<ul>
<li>A <a href="https://amzn.to/2DyaNvb">Tado</a> (duh!)</li>
<li>Your Username (usually your email address)</li>
<li>Your Password</li>
<li>A Client Secret</li>
</ul>

<h3 id="getting-the-client-secret"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#getting-the-client-secret">Getting the client secret</a></h3>

<p>I'm using this client secret:
<code>wZaRN7rpjn3FoNyF5IFuxg9uMzYJcvOoQ8QWiIqS3hfk6gLhVlG57j5YNoZL2Rtc</code>
This secret may change in the future.  In the examples, I'll shorten it to <code>wZa</code> to make it easier to read. You will need to use the full length secret when running this code.</p>

<p>To get the current secret,  you can visit <a href="https://my.tado.com/webapp/env.js"><code>https://my.tado.com/webapp/env.js</code></a> and get the secret from there.</p>

<pre><code class="language-js">var TD = {
    config: {
        version: 'v587',
        tgaRestApiEndpoint: 'https://my.tado.com/api/v1',
        tgaRestApiV2Endpoint: 'https://my.tado.com/api/v2',
        susiApiEndpoint: 'https://susi.tado.com/api',
        oauth: {
            clientApiEndpoint: 'https://my.tado.com/oauth/clients',
            apiEndpoint: 'https://auth.tado.com/oauth',
            clientId: 'tado-web-app',
            clientSecret: 'wZaRN7rpjn3FoNyF5IFuxg9uMzYJcvOoQ8QWiIqS3hfk6gLhVlG57j5YNoZL2Rtc'
        }
    }
};
</code></pre>

<p>If that ever changes, you will need to open your web browser's development tools, and then look in the network tab.  Then, log in to <a href="https://my.tado.com/webapp/"></a><a href="https://my.tado.com/webapp/">https://my.tado.com/webapp/</a>.</p>

<p>You should see the token:
<img src="https://shkspr.mobi/blog/wp-content/uploads/2019/02/tado-token-fs8.png" alt="Debug screen of a web browser." width="464" height="353" class="aligncenter size-full wp-image-31398"></p>

<h2 id="get-bearer-token"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#get-bearer-token">Get Bearer Token</a></h2>

<p>These examples use the <code>curl</code> command on Linux.</p>

<p>Here's how to turn your username and password into a "Bearer Token" - this is needed for every subsequent API call:</p>

<pre><code class="language-_">curl -s "https://auth.tado.com/oauth/token" -d client_id=tado-web-app -d grant_type=password -d scope=home.user -d username="you@example.com" -d password="Password123" -d client_secret=wZa
</code></pre>

<p>The response will be:</p>

<pre><code class="language-json">{
    "access_token": "abc",
    "token_type": "bearer",
    "refresh_token": "def",
    "expires_in": 599,
    "scope": "home.user",
    "jti": "xyz-123"
}
</code></pre>

<p>The real <code>access_token</code> will be <em>very</em> long. I've shortened it to <code>abc</code> make things easier to read in these examples.</p>

<p>The access token expires after 600 seconds. You can either request a new one with the username and password, or use the provided <code>refresh_token</code> like so:</p>

<pre><code class="language-_">curl -s "https://auth.tado.com/oauth/token" -d grant_type=refresh_token -d refresh_token=def -d client_id=tado-web-app -d scope=home.user -d client_secret=wZa
</code></pre>

<h2 id="get-your-details"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#get-your-details">Get your details</a></h2>

<p>The next step is to get your <code>homeId</code> - this will also be needed for subsequent API calls:</p>

<pre><code class="language-_">curl -s "https://my.tado.com/api/v1/me" -H "Authorization: Bearer abc"
</code></pre>

<p>You'll get back your data, like this:</p>

<pre><code class="language-json">{
    "name": "Terence Eden",
    "email": "you@example.com",
    "username": "your_user_name",
    "enabled": true,
    "id": "987654321",
    "homeId": 123456,
    "locale": "en_GB",
    "type": "WEB_USER"
}
</code></pre>

<p>Your <code>homeId</code> is what's important here. I'm going to use the example <code>123456</code> - you should use your own.</p>

<h2 id="check-it-all-works"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#check-it-all-works">Check it all works</a></h2>

<p>This request will check that you've got the right details.</p>

<pre><code class="language-_">curl -s "https://my.tado.com/api/v2/homes/123456" -H "Authorization: Bearer abc"
</code></pre>

<p>You'll get back information about your installation. I've redacted mine for privacy.</p>

<pre><code class="language-json">{
    "id": 123456,
    "name": " ",
    "dateTimeZone": "Europe/London",
    "dateCreated": "2015-12-18T19:21:59.315Z",
    "temperatureUnit": "CELSIUS",
    "installationCompleted": true,
    "partner": " ",
    "simpleSmartScheduleEnabled": true,
    "awayRadiusInMeters": 123.45,
    "usePreSkillsApps": true,
    "skills": [],
    "christmasModeEnabled": true,
    "contactDetails": {
        "name": "Terence Eden",
        "email": " ",
        "phone": " "
    },
    "address": {
        "addressLine1": " ",
        "addressLine2": null,
        "zipCode": " ",
        "city": " ",
        "state": null,
        "country": "GBR"
    },
    "geolocation": {
        "latitude": 12.3456789,
        "longitude": -1.23456
    },
    "consentGrantSkippable": true
}
</code></pre>

<h2 id="get-your-data"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#get-your-data">Get your data</a></h2>

<p>OK, here's where the fun begins. This gets the data about your installation - including firmware details, device names, etc.</p>

<pre><code class="language-_">curl -s "https://my.tado.com/api/v2/homes/123456/zones" -H "Authorization: Bearer abc"
</code></pre>

<p>Here's what you get back - I've redacted some of my details.</p>

<pre><code class="language-json">[{
    "id": 1,
    "name": "Heating",
    "type": "HEATING",
    "dateCreated": "2015-12-21T15:46:45.000Z",
    "deviceTypes": ["RU01"],
    "devices": [{
        "deviceType": "RU01",
        "serialNo": " ",
        "shortSerialNo": " ",
        "currentFwVersion": "54.8",
        "connectionState": {
            "value": true,
            "timestamp": "2019-02-13T19:30:52.733Z"
        },
        "characteristics": {
            "capabilities": ["INSIDE_TEMPERATURE_MEASUREMENT", "IDENTIFY", "OPEN_WINDOW_DETECTION"]
        },
        "batteryState": "NORMAL",
        "duties": ["ZONE_UI", "ZONE_LEADER"]
    }],
    "reportAvailable": false,
    "supportsDazzle": true,
    "dazzleEnabled": true,
    "dazzleMode": {
        "supported": true,
        "enabled": true
    },
    "openWindowDetection": {
        "supported": true,
        "enabled": true,
        "timeoutInSeconds": 1800
    }
}, {
    "id": 0,
    "name": "Hot Water",
    "type": "HOT_WATER",
    "dateCreated": "2016-10-03T11:31:42.272Z",
    "deviceTypes": ["BU01", "RU01"],
    "devices": [{
        "deviceType": "BU01",
        "serialNo": " ",
        "shortSerialNo": " ",
        "currentFwVersion": "49.4",
        "connectionState": {
            "value": true,
            "timestamp": "2019-02-13T19:36:17.361Z"
        },
        "characteristics": {
            "capabilities": []
        },
        "isDriverConfigured": true,
        "duties": ["ZONE_DRIVER"]
    }, {
        "deviceType": "RU01",
        "serialNo": " ",
        "shortSerialNo": " ",
        "currentFwVersion": "54.8",
        "connectionState": {
            "value": true,
            "timestamp": "2019-02-13T19:30:52.733Z"
        },
        "characteristics": {
            "capabilities": ["INSIDE_TEMPERATURE_MEASUREMENT", "IDENTIFY", "OPEN_WINDOW_DETECTION"]
        },
        "batteryState": "NORMAL",
        "duties": ["ZONE_UI", "ZONE_LEADER"]
    }],
    "reportAvailable": false,
    "supportsDazzle": false,
    "dazzleEnabled": false,
    "dazzleMode": {
        "supported": false
    },
    "openWindowDetection": {
        "supported": false
    }
}]
</code></pre>

<h2 id="state"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#state">State</a></h2>

<p>This command will tell you if you're home or not. Or, in other words, whether the Tado thinks you're nearby:</p>

<pre><code class="language-_">curl -s https://my.tado.com/api/v2/homes/123465/state -H "Authorization: Bearer abc"
</code></pre>

<p>This is what you'll get back if you're at home</p>

<pre><code class="language-_">{"presence":"HOME"}
</code></pre>

<h2 id="zones"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#zones">Zones</a></h2>

<p>My Tado has two "Zones".  0 is for Hot Water, 1 is for Heating. Yours may be different.</p>

<h2 id="hot-water-information"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#hot-water-information">Hot Water Information</a></h2>

<pre><code class="language-_">curl -s https://my.tado.com/api/v2/homes/123456/zones/0/state -H "Authorization: Bearer abc"
</code></pre>

<p>Here's information about your hot water:</p>

<pre><code class="language-json">{
    "tadoMode": "HOME",
    "geolocationOverride": false,
    "geolocationOverrideDisableTime": null,
    "preparation": null,
    "setting": {
        "type": "HOT_WATER",
        "power": "OFF",
        "temperature": null
    },
    "overlayType": null,
    "overlay": null,
    "openWindow": null,
    "nextScheduleChange": {
        "start": "2019-02-13T19:00:00Z",
        "setting": {
            "type": "HOT_WATER",
            "power": "ON",
            "temperature": null
        }
    },
    "link": {
        "state": "ONLINE"
    },
    "activityDataPoints": {},
    "sensorDataPoints": {}
}
</code></pre>

<h3 id="heating"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#heating">Heating</a></h3>

<p>It's much the same for Heating information:</p>

<pre><code class="language-_">curl -s https://my.tado.com/api/v2/homes/123456/zones/1/state -H "Authorization: Bearer abc"
</code></pre>

<p>This also gets you humidity data etc:</p>

<pre><code class="language-json">{
    "tadoMode": "HOME",
    "geolocationOverride": false,
    "geolocationOverrideDisableTime": null,
    "preparation": null,
    "setting": {
        "type": "HEATING",
        "power": "ON",
        "temperature": {
            "celsius": 15.00,
            "fahrenheit": 59.00
        }
    },
    "overlayType": null,
    "overlay": null,
    "openWindow": null,
    "nextScheduleChange": {
        "start": "2019-02-13T17:30:00Z",
        "setting": {
            "type": "HEATING",
            "power": "ON",
            "temperature": {
                "celsius": 18.00,
                "fahrenheit": 64.40
            }
        }
    },
    "link": {
        "state": "ONLINE"
    },
    "activityDataPoints": {
        "heatingPower": {
            "type": "PERCENTAGE",
            "percentage": 0.00,
            "timestamp": "2019-02-13T10:19:37.135Z"
        }
    },
    "sensorDataPoints": {
        "insideTemperature": {
            "celsius": 16.59,
            "fahrenheit": 61.86,
            "timestamp": "2019-02-13T10:30:52.733Z",
            "type": "TEMPERATURE",
            "precision": {
                "celsius": 0.1,
                "fahrenheit": 0.1
            }
        },
        "humidity": {
            "type": "PERCENTAGE",
            "percentage": 57.20,
            "timestamp": "2019-02-13T10:30:52.733Z"
        }
    }
}
</code></pre>

<h2 id="weather"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#weather">Weather</a></h2>

<p>Tado also provides you with data about the external weather:</p>

<pre><code class="language-_">curl -s https://my.tado.com/api/v2/homes/123456/weather -H 'Authorization: Bearer abc'
</code></pre>

<p>You get back a basic weather report for your location:</p>

<pre><code class="language-json">{
    "solarIntensity": {
        "type": "PERCENTAGE",
        "percentage": 68.10,
        "timestamp": "2019-02-10T10:35:00.989Z"
    },
    "outsideTemperature": {
        "celsius": 8.00,
        "fahrenheit": 46.40,
        "timestamp": "2019-02-10T10:35:00.989Z",
        "type": "TEMPERATURE",
        "precision": {
            "celsius": 0.01,
            "fahrenheit": 0.01
        }
    },
    "weatherState": {
        "type": "WEATHER_STATE",
        "value": "CLOUDY_PARTLY",
        "timestamp": "2019-02-10T10:35:00.989Z"
    }
}
</code></pre>

<h2 id="controlling-your-home"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#controlling-your-home">Controlling your home</a></h2>

<p>It's possible to turn the heating and hot water on / off.</p>

<h3 id="turn-heating-on"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#turn-heating-on">Turn Heating On</a></h3>

<p>This is a <code>PUT</code> request</p>

<pre><code class="language-_">curl -s 'https://my.tado.com/api/v2/homes/123456/zones/1/overlay' -X PUT -H 'Authorization: Bearer abc' -H 'Content-Type: application/json;charset=utf-8' --data '{"setting":{"type":"HEATING","power":"ON","temperature":{"celsius":21,"fahrenheit":69.8}},"termination":{"type":"MANUAL"}}'
</code></pre>

<p>Just to make it easier to read, this is the JSON data that you have to <code>PUT</code>:</p>

<pre><code class="language-json">{
    "setting": {
        "type": "HEATING",
        "power": "ON",
        "temperature": {
            "celsius": 21,
            "fahrenheit": 69.8
        }
    },
    "termination": {
        "type": "MANUAL"
    }
}
</code></pre>

<p>If it has worked, you'll get back this response:</p>

<pre><code class="language-json">{
    "type": "MANUAL",
    "setting": {
        "type": "HEATING",
        "power": "ON",
        "temperature": {
            "celsius": 21.00,
            "fahrenheit": 69.80
        }
    },
    "termination": {
        "type": "MANUAL",
        "projectedExpiry": null
    }
}
</code></pre>

<h3 id="end-manual-heading-mode"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#end-manual-heading-mode">End Manual Heading Mode</a></h3>

<p>This is a simple <code>DELETE</code> command:</p>

<pre><code class="language-_">curl -s 'https://my.tado.com/api/v2/homes/123456/zones/1/overlay' -X DELETE -H 'Authorization: Bearer abc'
</code></pre>

<h3 id="turn-on-hot-water"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#turn-on-hot-water">Turn on Hot Water</a></h3>

<p>Much the same as before</p>

<pre><code class="language-_">curl -s 'https://my.tado.com/api/v2/homes/123456/zones/0/overlay' -X PUT -H 'Content-Type: application/json;charset=utf-8' -H 'Authorization: Bearer abc'--data '{"setting":{"type":"HOT_WATER","power":"ON"},"termination":{"type":"MANUAL"}}'
</code></pre>

<h3 id="turn-off-hot-water"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#turn-off-hot-water">Turn off Hot Water</a></h3>

<p>Again, a <code>DELETE</code></p>

<pre><code class="language-_">curl -s 'https://my.tado.com/api/v2/homes/123456/zones/0/overlay' -X DELETE -H 'Authorization: Bearer abc' 
</code></pre>

<h2 id="historic-information"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#historic-information">Historic Information</a></h2>

<p>You can get a complete view of historic data with:</p>

<pre><code class="language-_">curl -s 'https://my.tado.com/api/v2/homes/123456/zones/1/dayReport?date=2018-02-14' -H 'Authorization: Bearer abc' 
</code></pre>

<p>The <code>date</code> at the end is in ISO8601 format. You'll receive info on internal and external temperature, humidity levels, whether the heating and hot water were on, and a few other bits and bobs.</p>

<h2 id="whats-next"><a href="https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/#whats-next">What's Next?</a></h2>

<p>There are a bunch of other things you can do with the API, like setting a schedule etc. Sadly, I don't have time to document them all.  But this should be enough to get you detailed information, and basic control.</p>

<p>I'd love it if someone could make OpenAPI documentation for this.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=31397&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2019/02/tado-api-guide-updated-for-2019/feed/</wfw:commentRss>
			<slash:comments>65</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[$3k Bug Bounty - Twitter's OAuth Mistakes]]></title>
		<link>https://shkspr.mobi/blog/2018/12/twitter-bug-bounty/</link>
					<comments>https://shkspr.mobi/blog/2018/12/twitter-bug-bounty/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Fri, 14 Dec 2018 12:09:32 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[Bug Bounty]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[oauth]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[twitter]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=30658</guid>

					<description><![CDATA[Imagine the scenario.  You&#039;re trying out some cool new Twitter app. It asks you to sign in via OAuth as per usual.  You look through the permissions - phew - it doesn&#039;t want to access your Direct Messages.    You authorise it - whereupon it promptly leaks to the world all your sexts, inappropriate jokes, and dank memes. Tragic!  What&#039;s going on?  Many years ago the official Twitter API keys were…]]></description>
										<content:encoded><![CDATA[<p>Imagine the scenario.  You're trying out some cool new Twitter app. It asks you to sign in via OAuth as per usual.  You look through the permissions - <em>phew</em> - it doesn't want to access your Direct Messages.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/Google-TV-Twitter-DMs-fs8.png" alt="A Twitter login screen. Highlighted is the information that it cannot access your DMs." width="697" height="456" class="aligncenter size-full wp-image-30659">

<p>You authorise it - whereupon it promptly leaks to the world all your sexts, inappropriate jokes, and dank memes. Tragic!</p>

<h2 id="whats-going-on"><a href="https://shkspr.mobi/blog/2018/12/twitter-bug-bounty/#whats-going-on">What's going on?</a></h2>

<p>Many years ago <a href="https://web.archive.org/web/20151112153930/https://gist.github.com/shobotch/5160017">the official Twitter API keys were leaked</a>.  This means that app authors who can't get their app approved by Twitter are still able to access the Twitter API.</p>

<p>For some reason, Twitter's OAuth screen says that these apps do <em>not</em> have access to Direct Messages. But they do!</p>

<p>In short, users could be tricked into allowing access to their DMs.</p>

<h2 id="restrictions"><a href="https://shkspr.mobi/blog/2018/12/twitter-bug-bounty/#restrictions">Restrictions</a></h2>

<p>There are some restrictions which Twitter has put in place in the name of good security. The most important of these is restricting callback addresses. After successful login, the apps will <em>only</em> return to a <em>predefined</em> URL.  That means you can't take the official Twitter keys and send the user to your app.  This is a sensible security decision.</p>

<p>Except... Not every app has a URL. Or supports callbacks. Or is an actual app.  Twitter has a secondary authorisation mechanism for such cases.  You log in, it provides a PIN, you type the PIN into your app.</p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2018/11/iphone-pin-fs8.png" alt="Twitter login screen displaying a security PIN." width="695" height="243" class="aligncenter size-full wp-image-30660">

<p>It appears that these official PIN apps don't display the correct OAuth information to the user.</p>

<h2 id="fixing-it"><a href="https://shkspr.mobi/blog/2018/12/twitter-bug-bounty/#fixing-it">Fixing it</a></h2>

<p>Will Twitter audit old apps and make sure the permissions are correctly displayed? I hope so!</p>

<p>Ideally, Twitter should have a much more granular permissions model. Allow apps to read DMs, but not send them. Write tweets, but not delete them.  Read Tweets, but not follow people.</p>

<h2 id="timeline"><a href="https://shkspr.mobi/blog/2018/12/twitter-bug-bounty/#timeline">Timeline</a></h2>

<ul>
<li>2018-11-06 Submitted via <a href="https://hackerone.com/bugs?report_id=434763">HackerOne</a></li>
<li>2018-11-06 Provided clarification and PoC. Issue accepted.</li>
<li>2018-11-15 Proposed publication date of 30th November rejected due to US holidays.</li>
<li>2018-11-16 Bug Bounty of $2,940 offered. Filled in the W2 form to say I'm not a US taxpayer.</li>
<li>2018-11-17 <a href="https://untappd.com/user/edent/checkin/676732835">Drank a fair amount of cider</a>.</li>
<li>2018-11-21 £2,287.05 deposited in my UK bank account. There was also the option of receiving it via PayPal.</li>
<li>2018-12-06 Twitter fixed the issue and <a href="https://twitter.com/edent/status/1070810894144339974">published the bounty payout</a>. They let me know I was clear to publish.</li>
<li>2018-12-07 I provided clarification that the issue was still present on some API keys.</li>
<li>2018-12-14 Published this report.</li>
</ul>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=30658&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2018/12/twitter-bug-bounty/feed/</wfw:commentRss>
			<slash:comments>4</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Musical Roombas!]]></title>
		<link>https://shkspr.mobi/blog/2017/11/musical-roombas/</link>
					<comments>https://shkspr.mobi/blog/2017/11/musical-roombas/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 19 Nov 2017 15:14:36 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[roomba]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=28777</guid>

					<description><![CDATA[A few years ago, I added WiFi to my Roomba using a 3rd party add-on.  Sadly, it looks like Thinking Cleaner, the company which created the WiFi unit is no longer manufacturing them.  But in their latest firmware release, they added a fun new option - the ability to make your Roomba sing!  Terence Eden is on Mastodon@edentI&#039;ve hacked @edent_roomba to obey its true master.(You&#039;ll want the volume up …]]></description>
										<content:encoded><![CDATA[<p>A few years ago, I <a href="https://shkspr.mobi/blog/2015/03/adding-wifi-to-a-roomba/">added WiFi to my Roomba</a> using a 3rd party add-on.  Sadly, it looks like <a href="https://web.archive.org/web/20171121060524/https://www.thinkingcleaner.com/">Thinking Cleaner</a>, the company which created the WiFi unit is no longer manufacturing them.  But in their <a href="https://web.archive.org/web/20180409225916/https://thinkingcleaner.com/firmware.html">latest firmware release</a>, they added a fun new option - the ability to make your Roomba <em>sing!</em></p>

<blockquote class="social-embed" id="social-embed-909880199667486722" lang="en" itemscope="" itemtype="https://schema.org/SocialMediaPosting"><header class="social-embed-header" itemprop="author" itemscope="" itemtype="https://schema.org/Person"><a href="https://twitter.com/edent" class="social-embed-user" itemprop="url"><img class="social-embed-avatar social-embed-avatar-circle" src="data:image/webp;base64,UklGRkgBAABXRUJQVlA4IDwBAACQCACdASowADAAPrVQn0ynJCKiJyto4BaJaQAIIsx4Au9dhDqVA1i1RoRTO7nbdyy03nM5FhvV62goUj37tuxqpfpPeTBZvrJ78w0qAAD+/hVyFHvYXIrMCjny0z7wqsB9/QE08xls/AQdXJFX0adG9lISsm6kV96J5FINBFXzHwfzMCr4N6r3z5/Aa/wfEoVGX3H976she3jyS8RqJv7Jw7bOxoTSPlu4gNbfXYZ9TnbdQ0MNnMObyaRQLIu556jIj03zfJrVgqRM8GPwRoWb1M9AfzFe6Mtg13uEIqrTHmiuBpH+bTVB5EEQ3uby0C//XOAPJOFv4QV8RZDPQd517Khyba8Jlr97j2kIBJD9K3mbOHSHiQDasj6Y3forATbIg4QZHxWnCeqqMkVYfUAivuL0L/68mMnagAAA" alt="" itemprop="image"><div class="social-embed-user-names"><p class="social-embed-user-names-name" itemprop="name">Terence Eden is on Mastodon</p>@edent</div></a><img class="social-embed-logo" alt="Twitter" src="data:image/svg+xml,%3Csvg%20xmlns%3D%22http%3A%2F%2Fwww.w3.org%2F2000%2Fsvg%22%0Aaria-label%3D%22Twitter%22%20role%3D%22img%22%0AviewBox%3D%220%200%20512%20512%22%3E%3Cpath%0Ad%3D%22m0%200H512V512H0%22%0Afill%3D%22%23fff%22%2F%3E%3Cpath%20fill%3D%22%231d9bf0%22%20d%3D%22m458%20140q-23%2010-45%2012%2025-15%2034-43-24%2014-50%2019a79%2079%200%2000-135%2072q-101-7-163-83a80%2080%200%200024%20106q-17%200-36-10s-3%2062%2064%2079q-19%205-36%201s15%2053%2074%2055q-50%2040-117%2033a224%20224%200%2000346-200q23-16%2040-41%22%2F%3E%3C%2Fsvg%3E"></header><section class="social-embed-text" itemprop="articleBody">I've hacked <a href="https://twitter.com/edent_roomba">@edent_roomba</a> to obey its true master.<br><br>(You'll want the volume up for this.) <a href="https://twitter.com/edent/status/909880199667486722/video/1">pic.x.com/urd5xuyuj1</a><div class="social-embed-media-grid"><video class="social-embed-video" controls="" src="https://shkspr.mobi/blog/wp-content/uploads/2017/11/musical-roomba.mp4" poster="data:image/webp;base64,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" width="550"></video></div></section><hr class="social-embed-hr"><footer class="social-embed-footer"><a href="https://twitter.com/edent/status/909880199667486722"><span aria-label="26 likes" class="social-embed-meta">❤️ 26</span><span aria-label="1 replies" class="social-embed-meta">💬 1</span><span aria-label="0 reposts" class="social-embed-meta">🔁 0</span><time datetime="2017-09-18T20:41:59.000Z" itemprop="datePublished">20:41 - Mon 18 September 2017</time></a></footer></blockquote>

<p>The Roomba has a basic speaker. It can play pre-recorded status messages - but it can also chirp out basic musical notes.</p>

<p>Following their <a href="https://web.archive.org/web/20160824051135/http://www.thinkingcleaner.com/setup/song/">guide to adding new songs</a>, I was able to customise my device to show true deference the ruler of our household!</p>

<p>I am <em>thoroughly</em> unmusical, so if any of you are able to magic up some delightful new tunes - that would be wonderful!</p>

<p><a href="http://www.thinkingcleaner.com/setup/song/"><img src="https://shkspr.mobi/blog/wp-content/uploads/2017/10/Noten_tabel_Roomba_HEX.png" alt="A list of musical notes and the Hex codes needed to make them play on the robot vacuum cleaner" width="822" height="956" class="aligncenter size-full wp-image-28778"></a></p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=28777&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/11/musical-roombas/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		<enclosure url="https://shkspr.mobi/blog/wp-content/uploads/2017/11/musical-roomba.mp4" length="2227540" type="video/mp4" />

			</item>
		<item>
		<title><![CDATA[Telnet and Root on the Sercomm iCamera2]]></title>
		<link>https://shkspr.mobi/blog/2017/11/telnet-and-root-on-the-sercomm-icamera2/</link>
					<comments>https://shkspr.mobi/blog/2017/11/telnet-and-root-on-the-sercomm-icamera2/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Tue, 14 Nov 2017 08:04:47 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[firmware]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[sercomm]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=28737</guid>

					<description><![CDATA[tldr;   URL http://[IP]/adm/file.cgi?todo=inject_telnetd Telnet username root Telnet password Aq0+0009   History  Four years ago to the day, I wrote an exposé of the hideous security failings of Sercomm IP Cameras.  The blog has since attracted 200 comments - as people try to unlock their cameras, and find out what flaws they have.  Despite my best efforts at contacting Sercomm - the OEM who …]]></description>
										<content:encoded><![CDATA[<p>tldr;</p>

<ul>
<li>URL <code>http://[IP]/adm/file.cgi?todo=inject_telnetd</code></li>
<li>Telnet username <code>root</code></li>
<li>Telnet password <code>Aq0+0009</code></li>
</ul>

<h2 id="history"><a href="https://shkspr.mobi/blog/2017/11/telnet-and-root-on-the-sercomm-icamera2/#history">History</a></h2>

<p>Four years ago to the day, I wrote an exposé of <a href="https://shkspr.mobi/blog/2013/11/hacking-around-with-network-cameras/">the hideous security failings of Sercomm IP Cameras</a>.  The blog has since attracted 200 comments - as people try to unlock their cameras, and find out what flaws they have.</p>

<p>Despite my best efforts at contacting Sercomm - the OEM who manufactures the cameras - and the "security" resellers who irresponsibly sell them to unsuspecting customers, the flaws remain unpatched.</p>

<h2 id="factory-reset"><a href="https://shkspr.mobi/blog/2017/11/telnet-and-root-on-the-sercomm-icamera2/#factory-reset">Factory Reset</a></h2>

<p>Most of the Sercomm cameras have a custom firmware which locks them down. As documented in <a href="https://shkspr.mobi/blog/2013/11/hacking-around-with-network-cameras/">my previous blog post</a>, resetting the cameras is depressingly easy.</p>

<ol>
<li>Stick paperclip in the reset hole for a few seconds.</li>
<li>The default login name is <code>administrator</code></li>
<li>There is no password set!</li>
</ol>

<h2 id="turning-on-telnet"><a href="https://shkspr.mobi/blog/2017/11/telnet-and-root-on-the-sercomm-icamera2/#turning-on-telnet">Turning on Telnet</a></h2>

<p>The process for enabling Telnet was <a href="https://web.archive.org/web/20110228233406/http://nurds-r-us.blogspot.com/2011/01/hacking-sitecom-wl-404-wireless-webcam.html">first published in 2011</a>.  It depends on the firmware that Sercomm have pre-loaded, but you just need to visit the specially crafted URl: <code>http://[IP]/adm/file.cgi?todo=inject_telnetd</code></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/10/telnet-fs8.png" alt="A web browser displaying the message &quot;Open Telnet Daemon successfully!&quot;" width="643" height="174" class="aligncenter size-full wp-image-28738">

<h2 id="firmware-trickery"><a href="https://shkspr.mobi/blog/2017/11/telnet-and-root-on-the-sercomm-icamera2/#firmware-trickery">Firmware Trickery</a></h2>

<p>Over on my <a href="https://github.com/edent/Sercomm-API/">GitHub repo of Sercomm API commands</a>, you'll find a copy of the <a href="https://github.com/edent/Sercomm-API/issues/4">firmware for the iCamera 1000</a>.</p>

<p>A contributor to the blog, Paul Chambers, describes how he deciphered the firmware.</p>

<blockquote><p>The firmware is a modified <a href="https://en.wikipedia.org/wiki/SquashFS">SquashFS</a> filesystem.
Inside, it contains a symlink from <code>/etc/passwd -&gt; /mnt/ramdisk/tmp/passwd</code></p>

<p><code>/etc/rc.sethost</code> contains the string <code>passwd</code></p>

<p>Running rc.sethost does various things including writing a passwd file to <code>/mnt/ramdisk/tmp/passwd</code></p>

<p>Inside that, I saw <code>root:9sXicXdz8JrVk:0:0:root:/root:/bin/sh</code></p>

<p>The string <code>9sXicXdz8JrVk</code> is a traditional <a href="https://en.wikipedia.org/wiki/Crypt_(C)#Traditional_DES-based_scheme">DES based hash</a></p>

<p>I patched <code>rc.sethost</code> to skip the call to <code>crypt</code>. Then I got:</p>

<p><code>root:Aq0+0009:0:0:root:/root:/bin/sh</code></p>

<p>I double-checked it was correct by running</p>

<p><code>squashfs-root$python -c "import crypt;print crypt.crypt('Aq0+0009', '9s')"</code></p>

<p><code>9sXicXdz8JrVk</code></p>

<p>So the username is <code>root</code> and the password is <code>Aq0+0009</code></p></blockquote>

<p>There you have it.  Different cameras may have different firmwares with different passwords - but I'd guess that they all follow a similar pattern.  This particular password works on Firmware version <code>V3.0.01.29</code></p>

<p>Enjoy!</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=28737&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/11/telnet-and-root-on-the-sercomm-icamera2/feed/</wfw:commentRss>
			<slash:comments>24</slash:comments>
		
		
			</item>
		<item>
		<title><![CDATA[Renault's Secret Mileage API]]></title>
		<link>https://shkspr.mobi/blog/2017/11/renaults-secret-mileage-api/</link>
					<comments>https://shkspr.mobi/blog/2017/11/renaults-secret-mileage-api/#comments</comments>
				<dc:creator><![CDATA[@edent]]></dc:creator>
		<pubDate>Sun, 12 Nov 2017 07:35:43 +0000</pubDate>
				<category><![CDATA[/etc/]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[car]]></category>
		<category><![CDATA[ev]]></category>
		<category><![CDATA[hacking]]></category>
		<category><![CDATA[NaBloPoMo]]></category>
		<category><![CDATA[renault]]></category>
		<guid isPermaLink="false">https://shkspr.mobi/blog/?p=28716</guid>

					<description><![CDATA[Last year I reverse engineered Renault&#039;s Electric Car API. One of the curious omissions was mileage - it just doesn&#039;t appear there.  However! All is not lost. If you log in to your Renault Account - https://www.renault.co.uk/my-account/my-car.html - you&#039;ll get details back about your car including its make, model, date of next service, and mileage!    Why isn&#039;t this in the regular API? Who knows. …]]></description>
										<content:encoded><![CDATA[<p>Last year I <a href="https://shkspr.mobi/blog/2016/10/reverse-engineering-the-renault-zoe-api/">reverse engineered Renault's Electric Car API</a>. One of the curious omissions was mileage - it just doesn't appear there.</p>

<p>However! All is not lost. If you log in to your Renault Account - <a href="https://www.renault.co.uk/my-account/my-car.html">https://www.renault.co.uk/my-account/my-car.html</a> - you'll get details back about your car including its make, model, date of next service, <em>and mileage!</em></p>

<img src="https://shkspr.mobi/blog/wp-content/uploads/2017/10/Renaul-Mileage-fs8.png" alt="Website showing my car and its mileage" width="1024" height="576" class="aligncenter size-full wp-image-28717">

<p>Why isn't this in the regular API? Who knows. But here's how to get it programmatically.</p>

<h2 id="api"><a href="https://shkspr.mobi/blog/2017/11/renaults-secret-mileage-api/#api">API</a></h2>

<p>The API to call is:</p>

<p><code>https://www.renault.co.uk/content/renault_prod/en_GB/index/my-account/my-car/jcr:content.getvehicle.json?vin=VF1ABCDE012345678</code></p>

<p>You will need to stick your own VIN on the end.</p>

<p>That alone won't get you very far - the API requires authentication (not always a given with automotive services!) See bottom of this page for details.</p>

<h2 id="data"><a href="https://shkspr.mobi/blog/2017/11/renaults-secret-mileage-api/#data">Data</a></h2>

<p>The data you get back is fairly unexciting:</p>

<pre><code class="language-json">{
    "lastMileageRefresh": "2017-10-15",
    "mileage": 2052,
    "averageMileage": 1973,
    "lastWorkshopVisitMileage": 1853,
    "portalServices": ["ZEPORTAL", "BATTERY", "RLINK"],
    "detailedVehicleName": "Dynamique Nav",
    "registrationNumber": "PK66LTE",
    "firstRegistrationDate": "2016-08-01",
    "electric": true,
    "vehicleManual": {
        "path": "//www.cdn.renault.com/content/dam/Renault/UK/owner-services/private/zoe/X101VE/manual.pdf",
        "size": "5.46MB",
        "extension": "pdf"
    },
    "upcomingServices": [{
        "year": "2018",
        "month": "september",
        "items": [{
            "date": "2018-08-01",
            "code": "13",
            "name": "Replace the cabin filter"
        }, {
            "date": "2018-08-01",
            "code": "185",
            "name": "Z.E. A service"
        }, {
            "date": "2018-08-01",
            "code": "186",
            "name": "Z.E. B service"
        }]
    }, {
        "year": "2019",
        "month": "september",
        "items": [{
            "date": "2019-08-01",
            "code": "13",
            "name": "Replace the cabin filter"
        }, {
            "date": "2019-08-01",
            "code": "180",
            "name": "Replace 12 V battery"
        }]
    }],
    "vin": "VF1ABCDE012345678",
    "vehicleName": "ZOE",
    "smallImage": "https://3dv1.renault.com/ImageFromBookmark?configuration\u003dSKTPOU%2FSSCALL%2FPRLEX1%2FSTANDA%2FB10%2FEA2%2FDD%2FCAREG%2FVT003%2FRET02%2FRALU16%2FDRAP03%2FOV369%2FRDAR02%2FALEVA%2FSOP02C%2FTRNOR%2FLVAVIP%2FLVAREL%2FNAV3G5%2FRAD06D%2FALAR06%2FSAN913%2FBT4MR1\u0026databaseId\u003da3750aea-330d-4c06-91fd-d2ec8d82e763\u0026bookmarkSet\u003dRSITE\u0026bookmark\u003dEXT_34_AV\u0026profile\u003dHELIOS_OWNERSERVICES_SMALL_V2",
    "largeImage": "https://3dv1.renault.com/ImageFromBookmark?configuration\u003dSKTPOU%2FSSCALL%2FPRLEX1%2FSTANDA%2FB10%2FEA2%2FDD%2FCAREG%2FVT003%2FRET02%2FRALU16%2FDRAP03%2FOV369%2FRDAR02%2FALEVA%2FSOP02C%2FTRNOR%2FLVAVIP%2FLVAREL%2FNAV3G5%2FRAD06D%2FALAR06%2FSAN913%2FBT4MR1\u0026databaseId\u003da3750aea-330d-4c06-91fd-d2ec8d82e763\u0026bookmarkSet\u003dRSITE\u0026bookmark\u003dEXT_34_DESSUS\u0026profile\u003dHELIOS_OWNERSERVICES_LARGE",
    "identifier": "X101VE"
}
</code></pre>

<h2 id="authentication"><a href="https://shkspr.mobi/blog/2017/11/renaults-secret-mileage-api/#authentication">Authentication</a></h2>

<p>In order to get these data, you will need a username and password for the Renault website.  Once logged in, you should be able to inspect the requests your browser makes.  All you need is the <code>X-Mapping</code> and <code>JSESSIONID</code> part of the cookie.  You'll end up with a request like:</p>

<pre><code class="language-_">curl 'https://www.renault.co.uk/content/renault_prod/en_GB/index/my-account/my-car/jcr:content.getvehicle.json?vin=VF1ABCDE012345678' -H 'Cookie: X-Mapping-pjobmcgf=123456789; JSESSIONID=abcdefghij;
</code></pre>

<p>If you dig around the Renault site, you'll see they use Apigee and helpfully include their <code>clientKey</code> and <code>apiKey</code> in some of the JSON they send to your browser.  I'm sure people smarter than me can figure out how to use them.</p>

<h2 id="the-cake-is-a-lie"><a href="https://shkspr.mobi/blog/2017/11/renaults-secret-mileage-api/#the-cake-is-a-lie">The Cake Is A Lie</a></h2>

<p>I am not convinced that this is <em>live</em> data. It looks to me like Renault are using your average yearly mileage and extrapolating what today's mileage will be.  But it is better than nothing.</p>
<img src="https://shkspr.mobi/blog/wp-content/themes/edent-wordpress-theme/info/okgo.php?ID=28716&HTTP_REFERER=RSS" alt="" width="1" height="1" loading="eager">]]></content:encoded>
					
					<wfw:commentRss>https://shkspr.mobi/blog/2017/11/renaults-secret-mileage-api/feed/</wfw:commentRss>
			<slash:comments>1</slash:comments>
		
		
			</item>
	</channel>
</rss>
