今天无意中备份博客的时候发现从VPS上拷贝下来的程序被小红伞报毒。查杀结果如下:
博客中毒了
128MB小内存VPS安装LNMP
买了个128MB内存的VPS,想装WordPress折腾下。软件当然首选LNMP,系统尝试了几次还是选Debian。话说高配置的机器还是推荐Centos,文档多,出了问题也好解决。但是像128MB内存的机器还是Debian省资源。
从lnmp.org下了一键安装包。可是尝试无数次都失败。最后看log发现是mysql安装失败。nginx和php都编译并安装,唯独mysql编译的时候out of memory了。于是想用一键安装包的脚本安装nginx和php等软件,mysql用apt-get安装。研究下了一键安装脚本,发现过于繁琐,虽然lnmp.org提供的一键安装包省事而且也能提高网站的访问体验,但是系统开销是很大的。
找来找去无意中看到了一个很神奇的脚本lowendbox的lowendscript。研究下了果断决定用这个脚本安装。
下面是LEB脚本包含的软件和对系统的修改
安装/替换的软件
dropbear to replace openssh. Invoked from xinetd.
inetutils-syslogd to replace rsyslog.
exim4 to replace sendmail (if installed). Re-configured to allow Internet delivery.
cron
nginx
mysql. Re-configured to remove innodb support, remove query cache and reduce key buffer size.
php with built-in FastCGI interface. Running only 1 child process and respawn after 5,000 requests.
对系统/软件的修改:
Removing some commonly bundled applications that should not be there in the first place for a minimal distro (apache2, sendmail, bind9, samba, nscd, etc).
MySQL root is given a new password (which can be found in ~root/.my.cnf)
Installing each WordPress site under /var/www/. It will create appropriate database, users and password for the site. Continue reading »
PHP下使用SimpleXML处理XML文件
最近找了个兼职,是维护一个团购网站。老板想抓取其他团购网站的的团购内容。因为许多团购网站本身提供api,所以我只要解析出api返回的xml就行了。下面的php下一种简单的xml处理方法。
1 SimpleXML 简介
要处理XML 文件,有两种传统的处理思路:SAX 和DOM。SAX 基于事件触发机制,
对XML 文件进行一次扫描,完成要进行的处理;DOM 则将整个XML 文件构造为一棵DOM
树,通过对DOM 树的遍历完成处理。这两种方法各有优缺点,SAX 的处理思路相对抽象,
DOM 的处理过程相对烦琐,都不很适合新手的入门。
PHP5 推出了一套新的XML 处理函数,即SimpleXML。名如其实,SimpleXML 本身小
巧精干,只提供了少量的几个方法函数,但用它处理起XML 文件功能却非常强大,操作也
非常的简单。
首先,它提供有简单的函数可以从XML 文档、字符串、或DOM 对象上直接构造出
SimpleXMLElement 对象;其次,SimpleXMLElement 提供有简单的方法可以进行属性、子节
点、和XPath 的操作;然而,SimpleXML 最简单的地方是,它提供有使用标准对象的属性和
对象迭代器进行节点操作的方法,这一处理思路使得用PHP 对XML 文档的处理得到了极大
的简化。
2 SimpleXML 入门示例
下面我们通过一些小的代码片段,稍微了解一下SimpleXML 的强大和简洁。为举例方便,
我们使用一个Messages.xml 文件,里面包含这样一段XML 代码:
Messages.xml
<?xml version=’1.0′ standalone=’yes’?>
<Messages>
<msg id=’1′>
<title>This is Title</title>
<content>Here is Content</content>
<time>2008-03-20 21:50:23</time>
<reply id=’11′>reply 1</reply>
<reply id=’12′>reply 2</reply>
</msg>
</Messages>
这是一篇保存有留言信息的XML 文档,每条信息包括属性id,子节点title、content、time
以及若干条对于它的回复信息,每条回复包括属性id 及回复的内容。
用SimpleXML 处理并输出此XML 文档内容的过程以及方法如下。
(1) 构造SimpleXMLElement 对象
代码片断
$xml = simplexml_load_file(‘Messages.xml’);
如果这段xml 已经被读入到一个字符串$messages 中,则可以使用如下语句:
代码片断
$xml = simplexml_load_string(‘Messages.xml’);
(2)输出留言1 的标题
代码片断
//可以使用属性的方式访问子节点,通过节点的标签名可直接得到节点的内容
echo $xml->msg->title;
(3)输出留言1 的第一条回复信息
代码片断
//同级别的多个同名节点自动成为数组,可以通过索引下标访问其内容
echo $xml->msg->reply[0];
(4)输出留言的id
代码片断
//节点的属性与值被封装成为关联数组的键与值
echo $xml->msg['id'];
(5)输出第二条回复的id
代码片断
//成为二维数组,第一维表示节点,第二维表示属性
echo $xml->msg->reply[1][ 'id'];
(6)依次输出所有回复的id
代码片断
//使用 foreach 对同名节点进行遍历
foreach ($xml->msg->reply as $reply){
echo $reply['id'];
}
(7)使用XPath 检索所有的回复信息
代码片断
//xpath 方法直接检索定位(//表示任意深度)
foreach ($xml->xpath(‘//reply’) as $reply){
echo $reply.’<br>’;
}
(8)遍历留言1 所有的子节点
代码片断
//children 方法得到所有子节点
foreach ($xml->msg->children() as $field){
echo $field.’<br>’;
}
(9)重新设置留言1 的发布时间
代码片断
//直接设置属性
$xml->msg->time = ’2008-03-21 00:53:12′;
(10)设置回复2 的id 属性
代码片断
//设置管理数组的值
$xml->msg->reply[1]['id'] = ’222′;
(11)新增一个描述消息作者的字段
代码片断
//直接设置属性
$xml->msg->author = ‘zhangsan’;
(12)将消息的作者保存为属性
代码片断
//设置关联数组的key
$xml->msg['author'] = ‘zhangsan’;
(13)重新保存对象到文件
代码片断
//保存
$xml->asXML(‘MessagesNew.xml’);
附录:
PHP SimpleXML 函数
PHP:指示支持该函数的最早的 PHP 版本。
函数 | 描述 | PHP |
---|---|---|
__construct() | 创建一个新的 SimpleXMLElement 对象。 | 5 |
addAttribute() | 给 SimpleXML 元素添加一个属性。 | 5 |
addChild() | 给 SimpleXML 元素添加一个子元素。 | 5 |
asXML() | 从 SimpleXML 元素获取 XML 字符串。 | 5 |
attributes() | 获取 SimpleXML 元素的属性。 | 5 |
children() | 获取指定节点的子。 | 5 |
getDocNamespaces() | 获取 XML 文档的命名空间。 | 5 |
getName() | 获取 SimpleXML 元素的名称。 | 5 |
getNamespaces() | 从 XML 数据获取命名空间。 | 5 |
registerXPathNamespace() | 为下一次 XPath 查询创建命名空间语境。 | 5 |
simplexml_import_dom() | 从 DOM 节点获取 SimpleXMLElement 对象。 | 5 |
simplexml_load_file() | 从 XML 文档获取 SimpleXMLElement 对象。 | 5 |
simplexml_load_string() | 从 XML 字符串获取 SimpleXMLElement 对象。 | 5 |
xpath() | 对 XML 数据运行 XPath 查询。 | 5 |
UPDATE1:想了半天。还是又把这篇文章发出来了。希望大家好好珍惜这个资源,不要浪费。
UPDATE2:你现在看到这篇文章为时已晚。见《和hax.tor.hu说再见》
我申请成功了,前面3道题几乎没变,第4道题方法没变,最后一道题,答案还是4个字母,但是对应字母和数字对应顺序可能和文中提到的不太一样了。要试几次找找规律。有问题可以给我留言。
hax.tor.hu 是一家提供带ssh的免费php+mysql虚拟主机的空间服务商,而且它的SSH隧道是开通的,但是想获得这一免费午餐,却让我大伤脑筋,因为它要求通过它的五道变态难题才行。
打开 http://hax.tor.hu/warmup1/ 开始猜解密码
1.这道题是用javascript设置的,提示“Password is in source.”说明密码就在网页之中,打开源码找到JS部分:
function a(){ thepw = ‘warmup1′; thepw = thepw+’lol’; thepw = thepw + ‘copter’;
if (document.lf.pw.value==thepw) { document.location = ‘/’+thepw; }
else { alert(‘That is not correct. Please try again.’); } } 看到了吧,密码是 “warmup1lolcopter”.
2.提示输入 www.fbi.gov 的SSH标记,有几个了解这些的连接,然而,这些连接只是扰乱视听。SSH一般使用22 端口,所以使用 PUTTY 或者是 telnet 尝试。
telnet www.fbi.gov 22 之后,出现的字符 SSH-1.99-Server-VII 便是答案
3.提交 “Bacon” 的变量名称。
这个简单,源码中的 select name=”chosen”> 说明 name=”chosen” ,所以在当前的浏览器中输入 http://hax.tor.hu/warmup3/?chosen=Bacon 回车就到第四关。
4.提示 密码又在源码中,打开源码并没有找到任何密码,密码一定在网页的报头中,Telnet 看看
telnet hax.tor.hu 80
回车输入
GET /pwfor4/ HTTP/1.1
Host: hax.tor.hu
看到返回信息了。
HTTP/1.1 200 OK
Transfer-Encoding: chunked 22 The password is: stickpick DOS窗口自动关闭。密码提示为 stickdeath
5.最后的一道难题。提示是下面的字符串是被加密后的密码,意思是解密给出的数值就是密码68 228 94 125 67 210 82 19
胡乱输入一个字符回车后,晕倒:Hash !!!也就说给出的那些数字是密码的哈希值,而哈希算法从来有名
尝试了几次之后,发现这也不是什么 哈希 目前是 site
破解方法: 两个数字的组合,代表一个字母,三个数字的组合标记位数,所以不用理睬三个数字的组合,也不用管最后两个数字的组合。
对应表单
a 77
b 78
c 79
d 72
e 73
f 74
g 75
h 68
i 69
j 70
k 71
l 64
m 65
n 66
o 67
p 92
r 94
s 95
t 88
u 89
w 91
z 86
比如:68 228 94 125 67 210 82 19 就是 site
===============================================
过了这五道难关,就可以申请账号了。输入账号,Email 后就去收邮件,收到邮件就登陆。https://hax.tor.hu/login 刚一登陆,就面对的是 Challenges Level 1,就是输入一个符合其要求的URL,然而这个URL几乎是不存在的。别担心,不用理睬Challenges Level,点左栏的 [ Shell ],申请 shell 账号,账号密码会邮件给你。下来开始配置 VHOST,配置空间大小,选 2000M 后点 “Update quota”,点 Web Setup 添加域名,在三个框中按照提示输入:
你的账号.shell.tor.hu www.你的账号.shell.tor.hu /home/home/www/你的账号.shell.tor.hu
点 “Add vhost” 完成。可以按照提示输入自己的域名,需要做CNAME 或者是 A 记录。这里是说明文件
http://shell.tor.hu/doc/web.txt
终于完成了申请,开始传文件。登陆FTP之后,如果是一片空白,则建立目录 www/你的账号.shell.tor.hu,
并把文件传到这个目录,好了,现在打开 http://你的账号.shell.tor.hu
shell 的使用,装上 putty 就能连上 shell.tor.hu ,又开始了 BSD 操作,usr/bin
http://hax.tor.hu/read/
————————————————–华丽的分割线————————————————–
下面的挑战对申请空间和ssh没有影响
level1挑战:
Hint: google is your friend.
这个题我半天没弄明白什么意思。Google了半天没找到答案。后来恍然大悟。解决方案如下:
登录nasa.gov,在搜索框里输入2110871202,确定即可。结果可想而知,找不到任何结果。但是没关系,这个网址就是答案。因为它既是以nasa.gov结尾,又包含2011871202。
level2挑战:
debfKNH1AvtBo deGH9Aq./kiSY denjFRfA8kzL2 deCfBQ0MS4MSA delCZeH4hHOq. deKaHJpaMFqSk deURVbdSEtxPo deImhlc0Y/L/k dehu92waVC.Pk deVX2jv60XD4Q detlQw1i3GbU2 der4QGDteh9qY
问题提示是使用the Ripper password cracker。
这一个题给出的实际上加密的unix口令,我们构造如下passwd文件:
user1:debfKNH1AvtBo:1:1:user:/home/user1:/sbin/nologin
user2:deGH9Aq./kiSY:1:1:user:/home/user1:/sbin/nologin
user3:denjFRfA8kzL2:1:1:user:/home/user1:/sbin/nologin
user4:deCfBQ0MS4MSA:1:1:user:/home/user1:/sbin/nologin
user5:delCZeH4hHOq.:1:1:user:/home/user1:/sbin/nologin
user6:deKaHJpaMFqSk:1:1:user:/home/user1:/sbin/nologin
user7:deURVbdSEtxPo:1:1:user:/home/user1:/sbin/nologin
user8:deImhlc0Y/L/k:1:1:user:/home/user1:/sbin/nologin
user9:dehu92waVC.Pk:1:1:user:/home/user1:/sbin/nologin
user10:deVX2jv60XD4Q:1:1:user:/home/user1:/sbin/nologin
user11:detlQw1i3GbU2:1:1:user:/home/user1:/sbin/nologin
user12:der4QGDteh9qY:1:1:user:/home/user1:/sbin/nologin
然后下载Ripper password cracker进行破译就可以了。其实破译结果是:
all you do now is enter 7 words with spaces between them
然后你随便输入7个字母就可以了,用空格隔开。比如a b c d e f g
level3挑战:
level4挑战:
We need the owl’s name. The owl appearing on the default vhost on hax.tor.hu’s IP.
Password is ??? ? owl.
The algorithm to encrypt the password is simply to expand every byte of the password to 2 bytes, swap the higher and lower 4 bits within each byte, xor each byte with A5. For example to encrypt the character “p”:
(ASCII is 70 hex):
70 is expanded to 70 00
After the swap the result is: 07 00
XOR with A5: A2 A5
Hence to decrypt it, we will take the odd bytes, XOR with A5, and swap the higher and lower 4 bits.
Take A2
XOR with A5: A2 XOR A5 = 07
Swap: 7 becomes 70.
This tool make use of the WinPcap library and it listen on TCP port 1433 and 2433 and perform the above algorithm to retrieve user name and password.
61 00 6e 00 73 00 61 00 63 00 74 00 69 00 6f 00 a.n.s.a.c.t.i.o.
6e 00 b1 a5 93 a5 e2 a5 f6 a5 c6 a5 b6 a5 11 a5 n……………
f3 a5 32 a5 4d 00 69 00 63 00 72 00 6f 00 73 00 ..2.M.i.c.r.o.s.
transaction后面,Microsoft前面跟着一段十六进制数
b1 a5 93 a5 e2 a5 f6 a5 c6 a5 b6 a5 11 a5 f3 a5 32 a5,这些数和前面给的例子很像。按上面
的步骤将些数破解得到密码:Act561Key。
level8挑战:
The password is shown on this jpg picture: index.jpg. You need a Hungarian host (ip with a .hu
reverse) to surf to it. Think, before you think you’re fucked or start googling for an open proxy
- there are easier ways (there is a reason why it is a picture), and you can cheat, too. Oh, and
for the love of god, please do not spam / post. It is not needed.
这一个挑战非常简单。你可以找个匈牙利(.hu)的代理,或者既然你已经走到了这一步,说明你
已经有了shell.tor.hu的帐号了。运行
wget https://hax.tor.hu/level8/the_password/index.jpg即可。如果提示证书有问题,则运行
wget –no check-certificate https://hax.tor.hu/level8/the_password/index.jpg即可。图片上可以
找到答案:tehpw。
level9挑战:
This is a relax-level DDoS is arriving from various hosts around the
world. 1/4 from the USA, 1/6 from Europe, 1/8 from Asia. There are 120
more hosts from Europe than Asia. Password is the total number of
attackers involved.
小学算术题,答案是2880。
level10挑战:
(hint)
最后给的提示是Computer songs and poems: g。这个好像是摩斯码之类的加密算法吧。可以按每个单词的字母个数找到对应的诗。这里对应的是Geek这首诗。按字母替换就可以找到答案:wildthing。
level11挑战:
Enter the hash for: “k y l h” (without spaces/quotes).Oh, BTW… You have exactly 7 seconds to do this
字符串是随机给的,时间最长是10s。提示给的链接是自动抽取字符串并计算md5的perl脚本和计算md5的网页。这道题实在是太麻烦了,我尝试了N种方法,具体代码我就不贴出来了,因为字符串是变的,所以也没固定答案。提供几个思路:
(1)手工计算。要求网速好,眼疾手快。ps:看看cheerleader这张图就知道这招不大现实。
(2)使用java或者其他语言自动获取网页,提取字符串,计算md5并提交。这个方法难点在于网页是https协议,而且要用post方法先登录网页。
(3)如果使用firefox,可以使用Greasemonkey插件添加js脚本,提取字符串,计算md5并输入到密码框里。ps:在尝试了(1)(2)失败后,我就是用的这个方法。
(4)其他方法。
level12挑战:
This is another relax-level Password is the solution to another game.
Mindfuck game: Round 1, Level 4.
Round 1, Level 1:wlcome
Round 1, Level 2:positive
Round 1, Level 3:chicken
Round 1, Level 4:sense
level13挑战:
The password to this level is shown upon login with a valid user/pass combination. Of course you don’t have to walk in the dark – you have the source for the script right here. Hint: bruting usernames is futile (in other words, don’t waste time on it).
问题提示的两个网址是https://hax.tor.hu/level13/login/index.php和https://hax.tor.hu/level13/login/source.php?file=index.php。第二个地址告诉我们source.php能让我们查看文件的源代码。/login/index.php里有这么关键的几句:
$rawconf = @file(“.htconfig”); // some config vars read from .htconfig 这告诉我们要查看.htconfig文件。直接访问不行,用https://hax.tor.hu/level13/login/index.php和https://hax.tor.hu/level13/login/source.php?file=.htconfig访问。
base /www/hax.tor.hu/www/level13/login/
userdir udir
fundir fundir
$info = implode(”,@file($conf['base'].$conf['userdir'].’/’.$user.’/info.txt’));这告诉我们要获取
user。我就是在这里卡住的。不知道要去哪里找。经别人提示,需要查看/index.php,但是这个
文件和/login/source.php是在同一目录下,而source.php告诉我们它会过滤“:”和“..”。这里我们用绝对
路径查看https://hax.tor.hu/level13/login/index.php和https://hax.tor.hu/level13/login/source.
php?file=/www/hax.tor.hu/www/level13/index.php。源代码里有一句注释:
// The only username is ‘justme’. But I doubt you need that any more )
用justme用户名获取info.txt
https://hax.tor.hu/level13/login/index.php和https://hax.tor.hu/level13/login/source.php?file=
/udir/justme/info.txt得到密码verynice。
这里我有个疑问,/www/hax.tor.hu/www/level13/index.php这个路径是绝对路径吗?这个绝对路
径的根应该不是linux的根目录下,好像是php服务的根目录(apache或者nginx)。高手可以给我留言。file()
函数的绝对路径到底从哪里开始?
level14挑战:
9 e 9 2 5 e 9 3 4 1 b 4 9 0 b f d 3 b 4 c 4 c a 3 b 0 c 1 e f 2 0 7 c c
6 9 4 b 9 b 3 f c 6 3 6 7 1 0 f a 0 8 b 6 9 2 2 c 4 2 b e 2 a 7 1 0 6 f
1 c c 8 b b 1 e 1 3 1 8 d f 7 0 a a 0 a 3 5 4 0 c 2 0 a d 4 d 7 6 f e 9
7 7 5 9 a a 2 7 a 0 c 9 9 b f f 6 7 1 0 8 9 7 5 9 e 1 2 8 4 e 2 4 7 9 b
9 9 1 d 2 6 6 9 d e 1 0 4 9 4 2
这个是md5值,需要破解。把上面的md5分成4段然后去http://www.xmd5.org/破解就可以了。破
解得到的是“thistime enter 12 words”。输入12个字母就可以。记得中间带空格。
level15挑战:
When was www.download.com‘s webserver last restarted?
Password is YYYY-MM-DD hh format. (hh=hours, two digits)
Bonus: Some listening material while reading the manual
UPDATE: Unfortunately download.com/server-status/ no longer exists.
Type ‘drat’ to move to the next level.
失效了,输入drat过关。
level16挑战:
SSHAUTH_IN root:hsmfs;g@10.0.0.5
打字的时候键盘歪了,冒号后面的字母按向左移一个键。密码是:gandalf。
level17挑战:
没看懂什么意思。
计算Google PageRank的php代码
可以方便调用。这段代码在windows和linux下都能用。
<?php
class PageRank
{
//settings – host and user agent
var $googlehost='www.google.com';
var $googleua='Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.8.0.6) Gecko/20060728 Firefox/1.5';
//convert a string to a 32-bit integer
function StrToNum($Str, $Check, $Magic) {
$Int32Unit = 4294967296; // 2^32
$length = strlen($Str);
for ($i = 0; $i < $length; $i++) {
$Check *= $Magic;
//If the float is beyond the boundaries of integer (usually +/- 2.15e+9 = 2^31),
// the result of converting to integer is undefined
// refer to http://www.php.net/manual/en/language.types.integer.php
if ($Check >= $Int32Unit) {
$Check = ($Check – $Int32Unit * (int) ($Check / $Int32Unit));
//if the check less than -2^31
$Check = ($Check < -2147483648) ? ($Check + $Int32Unit) : $Check;
}
$Check += ord($Str{$i});
}
return $Check;
}
//genearate a hash for a url
function HashURL($String) {
$Check1 = $this->StrToNum($String, 0×1505, 0×21);
$Check2 = $this->StrToNum($String, 0, 0x1003F);
$Check1 >>= 2;
$Check1 = (($Check1 >> 4) & 0x3FFFFC0 ) | ($Check1 & 0x3F);
$Check1 = (($Check1 >> 4) & 0x3FFC00 ) | ($Check1 & 0x3FF);
$Check1 = (($Check1 >> 4) & 0x3C000 ) | ($Check1 & 0x3FFF);
$T1 = (((($Check1 & 0x3C0) << 4) | ($Check1 & 0x3C)) <<2 ) | ($Check2 & 0xF0F );
$T2 = (((($Check1 & 0xFFFFC000) << 4) | ($Check1 & 0x3C00)) << 0xA) | ($Check2 & 0xF0F0000 );
return ($T1 | $T2);
}
//genearate a checksum for the hash string
function CheckHash($Hashnum) {
$CheckByte = 0;
$Flag = 0;
$HashStr = sprintf('%u', $Hashnum) ;
$length = strlen($HashStr);
for ($i = $length – 1; $i >= 0; $i –) {
$Re = $HashStr{$i};
if (1 === ($Flag % 2)) {
$Re += $Re;
$Re = (int)($Re / 10) + ($Re % 10);
}
$CheckByte += $Re;
$Flag ++;
}
$CheckByte %= 10;
if (0 !== $CheckByte) {
$CheckByte = 10 – $CheckByte;
if (1 === ($Flag % 2) ) {
if (1 === ($CheckByte % 2)) {
$CheckByte += 9;
}
$CheckByte >>= 1;
}
}
return '7'.$CheckByte.$HashStr;
}
//return the pagerank checksum hash
function getch($url) { return $this->CheckHash($this->HashURL($url)); }
//return the pagerank figure
function getrank($url)
{
$urlinfo=parse_url($url);
$start=$urlinfo["scheme"]<>""?strlen($urlinfo["scheme"]."://"):0;
$url=substr($url,$start);
$pr = -1; // default return
$ch = $this->getch($url);
$fp = fsockopen("www.google.com", 80, $errno, $errstr, 30);
if ($fp) {
$out = "GET /search?client=navclient-auto&ch=$ch&features=Rank&q=info:$url HTTP/1.1
";
//echo "<pre>$out</pre>"; //debug only
$out .= "User-Agent: {$this->googleua}
";
$out .= "Host: www.google.com
";
$out .= "Connection: Close";
fwrite($fp, $out);
//$pagerank = substr(fgets($fp, 128), 4); //debug only
//echo $pagerank; //debug only
while (!feof($fp)) {
$data = fgets($fp, 128);
//echo $data;
$pos = strpos($data, "Rank_");
if($pos === false){} else{
$pr=substr($data, $pos + 9);
$pr=trim($pr);
$pr=str_replace("",'',$pr);
return $pr;
}
}
//else { echo "$errstr ($errno)<br />"; } //debug only
fclose($fp);
}
return $pr;
}
}
//$gpr = new PageRank();
//echo $gpr->printrank("http://www.baidu.com/");
?>
近期评论