领土之争——入侵某视讯服务器回忆录
领土之争——入侵某视讯服务器回忆录
作者:唐不狐(blog.wang1.cn)
写在前面:
老早就打算写这样一篇文章:能够细致地反映出入侵中攻防的具体内容,我想这比单纯的技术文章有趣的多。有鉴于此,我将尽力完整描述入侵过程中的思考方式。
1.石榴裙下的kk
说实话,就第一次拿到权限而言,没有多少技术含量。我花了N久时间收集KK网络的各种信息,最终以arp欺骗获取权限。
kk的重要端口配置:ftp-21212;mssql-12345;terminal services-54321;
我们可以看到kk网管是有安全意识的,他把重要的数据端口改成10000以上的高端口,这在入侵之初就让我吃了闭门羹。因为我有个不太好的习惯,第一次扫描端口总是在1-10000内。而以上端口是我某次发狠心扫描1-65000发现的。
有了这个发现,我成功利用cain的arp欺骗功能获得:ftp口令,mssql口令,终端口令
2.webshell下的徘徊
再次证明kk网管对安全的意识就是在webshell环境中的遭遇,我是直接使用ftp上传shell,起初是海阳的2006版,shell没有写权限。
当时还没有嗅到终端口令,我在webshell里考虑着提权的可能性。mssql是2005版的,连接用户权限是db_owner,作为不大。ftp是FileZilla Server这款软件配置的。我之前入侵kk同段server的时候遇到过,这玩意的配置文件默认会泄漏口令,而且是明文的。
但令我失望的是kk网管的专业再次延长了其沦陷的时间。我从他的配置信息里读到32位的md5加密口令,破解失败。
当然我收获了第一步的成功果实,利用数据库管理功能刷了些点,自己爽了一晚上。
3.天堂与地狱的距离仅一步之遥
在我嗅到终端口令后,我一举拿下kk的2台重要server,其中一台是数据服务器。(口令不一样)
我很明白:kk网管很专业,也很勤快,几乎每天都会上来几次。我必须把后门做的隐蔽些。于是我做了较为详细的计划,如下:
a.我上线的时间应该是周末早上(这类成人站点晚上营业,周末早上是最安全的),避开网管
b.两台机子上的后门放置方式应该不一样(防治一台被查出,另一台也挂掉),后门也应该是多道的
c.日志处理要极谨慎
于是我在周六的早上6:00,悄悄登陆,分别做了以下工作。
1.我在有web的服务器上(有多个网站)的几个网站都插了一句话马,在隐蔽目录直接留了马,并修改了时间属性
2.一台机子我做了name$这样的隐藏帐号;而另一台我把sqldebugger用户克隆成administrator
3.我在数据库服务器上放了端口复用后门(后来发现tcp/ip筛选导致我这个后门无法使用)
4.我记录了所有已经获得的口令,并仔细查看了web网站结构,后台登陆口,数据库内的管理帐号(密码是加密的),包含经销商、主播、会员等的数据
5.我清理了曾经用过的程序日志,悄悄退出,并决定不再轻易登陆
6.arp依然是我的一道后门
然而,即便如此,接下来的几天,我都无法阻止权限的丢失。(当然主要暴露原因是我刷库造成的)
先是管理员发现了webshell的存在,他果断的直接使用备份还原。(kk的网站不大)接下来他又觉察到了FTP口令泄密,修改口令,并且做了ip限制。(这是我在后面使用放置在其他站的webshell查看配置文件知道的)。
再接下来,他又对sql端口,终端端口做了ip安全策略,仅允许指定的ip和ip段访问。这样我即使有口令也无可奈何了。
4.领土之争
kk的web脚本是aspx的,原先我留的aspshell总是被他抓到,我于是留了个心眼,藏了几个aspxshell混在里面。果然管理员并没有发现。(后来知道是禁用了asp)
于是我面临这样的处境:
我有一个aspxshell(lake2的)可以运行cmd,一个admin权限的用户口令。
限制是:shell没有写权限,lake2的这款shell连接sql时,遇到非1433端口,无法连接。而我又不能上传新的shell上去。
有人问:你怎么不用nc反弹呢?
kk做了tcp/ip筛选,对tcp端口的出站访问做了严格限制,仅允许80,21212,12345,54321,1935(flash media server).这也是我的端口复用后门失效的原因.(其实端口复用后门不是真正的复用,还是要用到其他端口的)
又有人问:psexec(pstools套件里的这个工具不是可以用吗?)
psexec的运行需要先决条件:即rpc共享开启,需要开启server,workstation服务.(kk的这两个服务是关闭的,而我在shell下是没有权限启动服务的).即便如此我在本地测试的时候都没有成功.
我考虑了3套可行方案:
a.我想到了runas命令可以其他用户身份执行指令,运行程序
b.sql的命令行用法:isql
c.入侵他允许连接的那些ip和ip段中的至少一台,作为跳板进去.(这个列表我已经获得)
最终我成功的2条.
a.runas需要二次交互,直接命令行是无法完成的,需要写脚本,或利用第三方程序.脚本我google到一些例子,本地都没有测试成功.工具也只是听说,无缘得见,本方案失败.
b.isql的用法
isql -S ip,port -U login_id -P pass -d database -Q "SELECT * FROM TABLE"
我翻阅了网上的资料,以上命令是正确的,但我在shell下连接时,却提示“登陆失败”。苦恼许久,最后才发现当pass中含有特殊字符时需要用“”包含起来。这一发现让我顺利的解决刷库问题。
接下来我尝试了猜解sa用户的口令,以期望用此来提升权限。失败
c.当我在第二套方案遇到问题时,我一边在网上翻阅资料,一边尝试了第三套方案。这中间遇到了一个问题。
我成功的拿到一个shell,并且找到了sa口令,本以为事情会很顺利。问题却来了:
内网,我需要上传lcx端口转发工具,才能远程登陆。在我上传的时候,我发现无论我上传什么,都只出现一个21B大小的文件。然后我利用tftp,ftp,vbs下载均告失败。
这个问题困扰了我几天。
后来我想起是不是因为组件的问题,导致我上传文件失败?我浏览了server的程序文件夹发现其安装有另外的上传组件。这坚定了我的判断。于是解决方案也随之出炉了:
我找了一个无组件上传脚本,顺利的解决了文件上传问题。当然这里遇到我们亲爱的瑞星的小小阻扰。(以前瑞星对加壳的文件查杀能力是很弱的,新版这方面有所提升,当然免杀一个lcx并非难事,就此不表)
有了上面的成功,我成功的再次进入kk的服务器。
5.好事多磨
当我得意的用刷库的帐号去网站溜达的时候,却发现我无法正常使用该帐号,总是在连接到它的3号视讯服务器的时候,当掉。更严重的时,几次之后我的ip就会被封锁。
我意识到问题的棘手。通过抓包,我获取了3号视讯服务器的ip。
并再一次成功入侵,这次入侵更有了一些意外收获。我在翻查msn聊天记录的时候,得到很多重要的口令。更对整个公司的运作有了充分的了解。
6.尾声
这场领土之争谈不上谁胜了,而我写此文的目的也不仅是展现一次入侵,更是一次防守。立体的攻防演练,我们不防当作一次黑盒测试。
浅谈web app二次漏洞
作者:T_Torchidy (jnchaha_at_163.com)
来源:安全焦点
在假设设计上不存在问题(即人解决某个应用的方式不存在问题)以及所采用的语言以及其他周边组件是安全的情况下,程序的漏洞就大部分就是由于在实现问题的过程中,程序员对安全的漠视或是对安全的不太了解造成的,而从程序的角度看,这种漏洞不外乎是不安全的参数进入不安全的操作中引起的。
不安全的操作大家都知道有很多,譬如文件读写,数据库查询,代码执行以及其他的一些危险函数的使用等等,那么不安全的参数主要是哪些呢?有人说所有用户的输入都是有害的,在我看来输入可以分两种,直接的输入与间接的输入。直接的输入是可以看到的,如url里的参数,浏览器与服务器的一些环境变量,用户提交的Cookie,用户通过表单进行的输入等等,对于这些输入大部分的程序员都会在安全上比较在意,比较注意参数的过滤,因为这些输入是显而易见的,触发比较简单,甚至一些输入如果不做过滤的话会导致程序出错,再加上PHP这种语言对于一些进入的参数的默认保护(Magic Quote选项),所以这种参数现在在大的程序里比较少出问题,但是另外一种隐式的输入却被人们忽略了,那就是来自数据库(包括Mysql这种数据库,文本数据库和一些人常用的cache以及php配置文件等等),可以尝试为程序做一个流程图:
处理流程 用户的输入==========> 程序处理(过滤)=========> 数据存储 ==========> 程序处理==========>输出给用户
数据流程 原始的数据如’=======> 程序处理(安全的数据如\’)==> Mysql里存储(原始的数据如’)========>程序处理(处理的是’)=========>输出给用户
可以看到,如果用户的输入暂时性地存储在数据库里然后被取出来使用而没有加过滤的话是很危险的,因为这个时候数据就是用户输入的最原始的数据不受GPC等安全措施保护,另外就是这种漏洞触发的条件比直接用户的输入要多一些操作,所以一般的测试比较难发现,而会被误认为是安全的。
上面的模型只是简单地说明问题的存在,实际情况里完全不局限于上面提到的’和mysql等等,实际上,动网使用的将一个’转换成’’的处理Sql 注射的方法还是很危险的,就很容易遭受这种攻击,事实上我也发现过这种问题:)从程序员的角度想想,什么时候会现这种安全问题呢?数据需要暂时地存储在某个地方,然后在另外的地方需要从里面取出来进行操作,那么什么时候会这样什么时候容易出现问题呢?譬如注册的时候的用户名,如果允许’的话就等于是把祸根引入了,因为很多地方都需要使用用户名,而且用户名是存储在数据库里的,如果在后面的操作里不小心把用户名取出来直接送到数据库操作里就会出现问题(或者是将用户名放到session里然后进行操作),这种情况下可以看成是数据库到数据库的操作,不受GPC影响当然会出问题啦!当然问题不只是’,用于文件操作的\0呢?通常会被addslashe的\0,如果有从数据库直接到文件操作的数据流程,危险是很大的。而且在程序员的眼睛里,可能无意识地认为从数据库里出来的东西都是经过检查的东西,但是事实上常常相反。
那么如何避免并且检测这种漏洞呢?对于开发者首先就是良好的编程习惯以及安全意识,明白数据库以及缓存文件里出来的东西一样不安全,其次就是在进行数据过滤的时候,不要只是暂时地让数据失去危害,可以考虑永久地让数据失去危害,譬如在过滤的时候不是将’变成\’等,而是在条件允许的情况下将其直接转换成HTML字符',这样并不影响显示但是数据却不再会包含让数据库的元字符所以不用担心注射了,其他的字符可以一样考虑处理。另外就是尽量对数据库进行严格的设计,实际上在存储的过程中有一层隐含的数据过滤,譬如数据字段的大小限制了数据的长度,数据字段的类型限制了数据的类型,所以我们尽量在允许的条件下使用数字类型的字段,并且尽量将数据字段的大小缩小,无论是在存储还是安全上还是很有意义的。对于检测的人员来说,如果是白盒操作,可以将数据库的字符类型的字段取出来,然后在程序里检查这些字段的去向,实际上就是将视角放到隐含的输入上检查问题,譬如我这里就有段检查类型的代码:
/*Codz By 剑心*/
$host=’localhost’;
$user=’root’;
$password=’loveshell’;
$dbname=’discuzl’;
$link = mysql_connect($host, $user, $password);
if (!$link) {
die(’Could not connect: ’ . mysql_error());
}
echo "Connected successfully\r\n";
if(mysql_select_db($dbname, $link)) {
echo "Select Database successfully\r\n";
}
$result=mysql_list_tables($dbname);
while ($row = mysql_fetch_row($result)) {
print "Table: $row[0]\r\n";
print "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n";
$result2=mysql_query("show full fields from `$dbname`.`$row[0]`");
while ($row2 = mysql_fetch_row($result2)) {
if(strpos($row2[1],’int’)===false&&strpos($row2[1],’enum’)===false&&strpos($row2[1],’decimal’)===false&&strpos($row2[1],’date’)===false){
print "字段: $row2[0]\t\t属性: $row2[1]\r\n";
}
}
print "+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++\r\n";
}
?>
然后就可以关注这些字段来检查问题了,当然并不是所有的字段都是可以控制的,关注对字段的insert update 操作可以知道输入可以有哪些更改,而select之后的操作可以检查这些字段将会进入哪些危险的操作,而如果是黑盒操作,因为代码的不透明就只能根据自己的一些探测来猜测对方的代码是如何实现的来检测是否含有二次漏洞了。
文章比较简单,期待更有意义的东西出来,譬如基于数据库的Fuzz等等。










