低端姿势拿下某IDC公司主站
前言:
开头之前先说一些废话,有一些是对我之前渗透,编程之路的自学回忆,也有一些是自己的感悟。不敢说自己的见解有多高深,但是敢保证完全都是真实经历。
回忆:
距离上一次做渗透测试还是很久以前的时候了,很久以前自己还只是一个脚本小子,在学习我人生中自学的第一门编程语言VB6.0之后,借助仅有的VB基础了解了一下VBScript以及ASP3.0几大内置对象之后,就开始上手使用过气的ASP开始做一些小网站小功能。
俗话说得好,知己知彼百战百胜,那个时候,IIS6.0+ASP3.0+Access的技术栈还是非常流行的,大大小小的新闻站博客站企业宣传站,甚至是各地政府机关事业单位的系统都是使用这一套技术栈做的(比如我老家的政府市长信箱,高考志愿填报系统等等)。因为Windows平台+Office套件+IIS的可视化服务器配置,这一套技术栈的入门做的非常新手友好。没过多久时间把前端HTML+CSS+JavaScript复习一下,我算是正式走上了WEB开发的道路。
大概在一个月明星稀的夜晚,对高考无望的我在网上自己搜索了一些关于Access注入的文章之后,结合自己之前已有的基础,像是打开了新世界的大门。原来show.asp?id=1997的id参数还可以提交除了数字以外的内容啊!果然我的以往的思维受到了局限,就像是之前做数学题总是忘记考虑变量为零,忘记考虑开根之后有负数的情况一样,很多程序员同样也和我一样没有考虑到id这里是可以人为修改,提交非数字的内容导致系统错误,甚至是可以提取敏感数据的SQL指令,或者根本不用提交恶意SQL指令,因为系统错误里面可能就暴露了敏感数据,导致千里之堤毁于蚁穴。
遇到瓶颈:
小小的我不满足于只靠一些已有的漏洞利用思路,固定流程的工具脚本来做渗透测试。碰到一些自己没接触过的技术栈,框架,可能就没办法继续下去了。渗透不仅仅只是拿工具一通乱扫。有些背后的东西,只有自己亲身用过,了解过,才知道什么地方容易出问题,什么地方隐藏着深不可测的可能导致千里之堤毁灭的“蚁穴”。于是现在更多时间花在了基础的学习上。
有句话叫做:学得越多,越觉得自己什么都不懂。很多年以前不太明白这句话究竟是神马意思。后来在看乌云,看知识库的时候彻底明白了这句话的含义。学习对的东西,是这个世界上永赚不赔的生意。
废话就说那么多啦,还有什么想聊的欢迎私信我。下面开始正题。
事发起因:
朋友听说花4W重做了一个官网主页
我表示想要见识见识现在的四万块钱外包做的成果是什么样子。(当然应该是开玩笑的,这站我看了不需要那么多钱的)
信息收集:
一般准备对一个网站入手,首先都应该观察的是他的网站结构,URL,目录等等,这些地方一般都具有一些很明显的特征,很容易暴露出该网站使用的技术栈,框架。
于是当我鼠标移上“首页”链接的时候,看到了广大PHPer非常熟悉的URL结构。
这不就是ThinkPHP默认的URL样式嘛!
不过ThinkPHP有好几种版本,我们还得测试一下版本看看,最简单的就是报错。
ThinkPHP默认情况下的路由规则是[应用]/[控制器]/[操作],我们可以给他一个错误的应用,一般就会抱错。这里居然没有关闭debug显错,这是一个非常危险的行为。
在ThinkPHP,Yii,Symfony,Laravel安装了debug-bar等插件的情况下,debug信息会暴露非常多的关键信息。
老版本的ThinkPHP 3.2会暴露调用栈,通过调用栈信息可以判断版本号,文件物理路径。
新版本的ThinkPHP 5.0如果没有关闭debug显错,会暴露文件源码,一般源码里面会有很多关键信息,甚至会暴露硬编码在源码里面的密钥,签名,内网ip等等。如果该页面连接了数据库,ThinkPHP 5.0的调试栏甚至会直接暴露调用过的配置信息,其中就会有数据库的账户密码ip等等。
而Flask等python上的框架没有关闭debug那简直就是致命灾难,Flask的调试模式里面可以直接执行python语句,相当于给黑客直接免费赠送了一个webshell。
这些东西都是需要自己有开发经验,能看懂各种调试信息,对框架很熟悉,才能对于这种危险有所认识了解,否则近在眼前的利用点,可能都会被忽略,从而让你觉得拿下这个网站的目标远在天边。
分析服务器环境:
我们看到目录下有phpStudy,这是一个非常新手友好化的PHP集成开发环境,在这里我强烈推荐各位PHP新手使用,他把整个WAMP环境的部署配置都做的像IIS一样可视化操作,非常方便,而且这款软件是免费的,非常良心。
嗷跑题了,我们接着说分析服务器环境。
phpStudy默认是安装了phpmyadmin的,并且根目录下自带phpinfo.php文件和l.php这个探针文件,这又为我们刺探服务器信息提供了非常多的帮助。
不过这些都不是什么,我更关心的是phpmyadmin。
因为我们拿下一个站的最终目的就是放置webshell,提权获取服务器最高权限。所以我们需要找一些能够在服务器上放置文件的办法。
phpStudy默认的数据库帐号密码都是root,所以我们在phpmyadmin试试看。
果然还就真的进去了,我的天,这安全意识多差啊,root密码都不改的?
接着我们知道root帐号登录的情况下,可以使用OUTFILE的方式导出文件。从而在服务器上放置我们的webshell,并且我们由于通过ThinkPHP的报错已经知道了服务器的物理路径,所以我们可以直接将webshell放置在web目录下访问。当如果ThinkPHP没有报错也没关系,phpmyadmin是一个多入口的php程序,我们可以通过访问phpmyadmin本身一些非入口文件,让他报错来显示web目录的物理路径。
我们先执行
SELECT * FROM `mysql`.`user` INTO OUTFILE 'D://phpStudy//WWW//ThinkPHP//test.php';
发现报错为
#1290 - The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
一般出现这个报错是因为现在的MySQL考虑到安全原因,一般都禁止了这种文件导出功能,而要开启这个功能,必须修改my.ini等配置文件,而我们现在连webshell都没有拿到,根本无法修改,所以我们可以换个思路。
我之前曾经写过一个监控MySQL的SQL查询执行的程序cw1997/MySQL-Monitor,借助的就是MySQL的general_log,MySQL中这个general_log是用于记录MySQL中所有执行过的SQL查询,他的记录方式可以是数据表,也可以是文件,并且文件路径也可以指定。
并且最关键的一点是,这个功能是可以动态开启的,所谓动态开启,就是可以不需要重启MySQL。那么我们是不是可以通过开启这个功能,然后我们将这个文件路径设置到web目录下,并且文件名扩展名设置为.php,然后我们再手动查询一下webshell脚本的代码内容,这样这个执行记录就存储在了这个日志文件里面,所以我们只要一查询
那么这段代码就被永久存储在了这个php文件中,并且由于我们将他设置了php扩展名,那么可以按照标准的php文件解析,不就实现了在服务器上放置webshell吗?
getwebshell:
执行如下sql,便可以写入成功webshell到网站web目录下,webshell访问地址为http://www.xxx.com.cn/ThinkPHP/test.php,密码为admin。
show global variables like '%general%';set global general_log = on;set global general_log_file = 'D://phpStudy//WWW//ThinkPHP//test.php';select '';
我们这里注意一个细节,就是第一条sql执行的时候general_log已经是ON了。
默认情况下MySQL是关闭了这个功能的,所以我们高度怀疑这个网站可能已经有前辈先我一步拿下了。
这个时候你们猜猜用菜刀能连上吗?
细心一点回味前面的内容,仔细想想???
——————给你们10秒钟时间——————
.
.
.
.
.
.
.
.
.
.
肯定是连不上的,还记得前面那个l.php的探针截图里面,我测试了ev(防和谐补丁)al这个函数是执行不了的对吗?执行不了那肯定就连不上啦!
但是别忘了php还有一个assert断言函数照样可以动态执行php代码,这个assert就是一个漏网之鱼,也是一个能把千里之堤毁灭的“蚁穴”。
我们换一下执行语句。
这下就算是成功拿下了webshell。
参观比我先行一步的黑客前辈:
前面提到了general_log已经被开启,高度怀疑之前已经有人入侵成功过这个网站,现在直到看到这个文件,更加证实了我的判断。
看index.php正常文件的修改时间,再看看这个webshell的修改时间,果然这个网站上线12个小时,就有黑客来“光顾”了!!!真是无孔不入啊!
通过判断那个a.txt的时间,应该也是它留下的,打开一看是二进制乱码,应该是他的一个木马。
这就是典型的MySQL general_log日志格式,看来他也是用这种方法拿的webshell啊,从这里我们也可以看出这种方法拿webshell的原理。并且可以看出他的木马比我免杀做的更厉害。
提权:
在Windows环境下,MySQL,Apache等进程一般都是以administrator权限登录,这一点和iis,sql server不一样,所以意味着提权一般不会很难。
先看看服务器开放端口
公网开放了3389端口,可以直接连上。
查看进程,发现有安全狗,但是我这么多getwebshell等操作,居然没有报警和拦截,可能是老版本狗。
试了一下加账户提权,发现可以加帐号,但是提权失败。
应该是安全狗搞的鬼。
一个细节:
大家注意到了一个细节,为什么提权的时候我换到了Windows Server 2003下操作?
我给一张图大家就能明白了。
Windows 7下访问一般情况下为了安全起见只会显示一个小对话框,而Windows Server 2003是会直接进入远程桌面的欢迎界面,这样方便我们查看Windows版本,以及测试shift等后门。
像Windows 7一般用getpass.exe等工具是抓不到密码的,所以获取到了Windows版本可以方便我们对症下药。
提权失败:
因为有安全狗,所以我就懒得继续弄下去了,一般安全狗等防护软件和黑客之间的较量永远在不断升级,攻与防之间的博弈在时间的流逝中激烈的进行着,除非是在这一行有着非常深入的钻研和与时俱进的精神,不然还是比较难弄的。我这也算是一个半途而废的反面教材把。
一些社工:
俗话说得好,人心最难防。
也有俗话说得好,木桶里面的水取决于最短的那块木板。
而人,有的时候往往就是最短的那块木板。
很多时候软件,硬件防御措施做得很好,但是这种防御总归需要人去操作,有人的参与,那么就有可能存在漏洞。
前期我也通过社工,大致了解了一下他们服务器在五一节是否有值班人员维护。
以及判断一下安全狗的版本情况(因为老版本安全狗不需要用户登录安全狗帐号即可使用)。
讲到社工,那又是另一门学问了。安全界有一本社工圣经——《渗透的艺术》,无人不知,无人不晓。
总结:
从这个渗透案例来看,真的几乎是毫无水平,很多都是网站开发者自己的设置不当,安全意识不足埋下的定时炸弹,这个定时炸弹在仅仅12个小时之后就已经开始爆炸了。可见安全问题无处不在,我们整个渗透流程中,任何一环都可能存在“蚁穴”,他会将整个系统击溃。
感悟:
其实网络安全问题无时无刻都发生在我们身边,“徐玉玉”事件发生,源头就是当地有关行业的系统网站被入侵导致信息泄漏,根本就是这些粗制滥造网站的开发者,对于安全问题的漠视。
作为一个WEB开发者,先不说别的,就光ThinkPHP默认的URL路由,都不知道将多少搜索引擎的爬虫拦在了门外,作为一个企业宣传站,连基本的SEO都成问题,这样的外包团队,这样的劣质开发者却仍然可以继续在各种垃圾外包公司“招摇撞骗”。靠着半吊子技术苟活于人间。
还有这个圈子的某些人浮躁的不像话,像个跳梁小丑一样,拿着别人的工具,别人写好的脚本或者metasploit模块弹个计算器,就敢在外面自称白帽子。批量扫了几个xss,弹了个窗提交了SRC,就开始打着各种旗号开办培训班收徒,或是各大展会露脸,朋友圈微博轮番来一波图片轰炸,结识几个老板,到处拉像“徐玉玉”案件源头这种卖数据的单子,靠着这种黑心钱发家致富。有些人,甚至成为了知乎,微博的大V,甚至就在我们的身边,打着安全培训的幌子,培养者一批又一批的黑手,继续残害着像“徐玉玉”一样的家庭。
稍微好一点的,也是黑吃黑,帮助菠菜,大人站做黑帽SEO,影响别的企业在搜索引擎的排名。我在第一次进这些webshell售卖群,看到的信息也是令我震惊,大到gov,edu,央企官网,小到批量来的企业站个人站博客站,标出的价格触目惊心。
最让我感到震惊的是某CTV,就是大家天天看电视都能看到的那个电视台的官网,有人在群里面卖这个官网的shell,权重很高价格也很贵。我一开始不信,但是后来他发了一张菜刀的连接截图,里面的目录结构我一个一个试了一下,果然都对上了,应该是真的。原来这么大的央企,在网络安全的防护仅仅如此。因为他们对于网络安全的漠视,导致这些权重极高的网站webshell流到了某些黑帽SEO之手,他们帮助菠菜,大人行业做SEO,借助大站的权重提升这些违法网站的权重和搜索引擎排名。这些央企,gov的网络部门由于自己的失职,导致自己的网站无形间成为了这些违法行业的帮凶。后来由于记者变多等种种原因,一般这些群都很快就会解散换阵地,后面是否卖出去了也就不得而知了。这些事情真的在后面完全改变了我的价值观,原来我们天天使用的各种网站,早已被各种黑手给渗透进去了。
请每一个准备进入开发者行列的同学,请在心理装着你的用户安全,用户从注册你的网站那一刻开始,就把他的隐私托付给了你,请用心对待!每一个曾经试图使用技术这把双刃剑在法律边缘行走的同学,请想想你的父母老师朋友,想想国家为我们的付出,他们可不希望我们在邪路上越走越远,造成一失足成千古恨。谢谢各位聆听我的感悟!