Featured

소개글

반갑습니다!

제 이름은 임준오(Im, Juno)입니다.

이 블로그는 연구한 내용, 일상, 제 삶을 쓰려고 만들었습니다.

저는 Theori (https://theori.io/) // 보안 회사에서 연구원으로 열심히 일하고 있습니다.  일하는 만큼 CTF도 참가합니다. 최근에는 PS에도 도전해보려고 합니다. (18년 09월 28일 현재까지 꺼내보지도 않고 있습니다 ㅜ)

취미

여행 다니며 맛있는 음식을 먹는걸 좋아합니다. 제가 먹은 맛있는 음식들이 보고 싶으시다면, 인스타그램 @junorouse 를 찾아주세요.

전시회나 갤러리 혹은 미술과에 가는 것을 좋아합니다.

시간이 나면 독서를 하거나 영화를 봅니다.

최근에는 스쿠버 다이빙도 시작했습니다. (언제쯤 다시 가려는지 모르겠네요,,)

 

연구 분야

  • 최근, 관심을 가지며 공부한 분야는 스마트 컨트랙트입니다. (블록체인 기술은 아니에요.)
  • CTF에서 승리할 수 있는 전략을 생각하는 것도 좋아합니다.
  • 취약점을 어떻게 하면 정형화 시키고 자동화 시킬 수 있는지에 관해 생각하는 걸 좋아합니다.
  • 새로운 웹 프레임워크의 취약점 찾는 것도 좋아합니다. 마찬가지로 새로운 기술들을 가지고 개발해보거나 분석해보는 일을 좋아합니다 !

–> 제가 했던 연구 결과는 아래 페이지에서 확인하실 수 있어요 ! (언젠간 추가될 페이지)


업데이트

2018-06-03 예전에 작성했던 기술 문서 / 여행 관련된 글을 조금씩 가져오려고 합니다. (완료)
2018-09-29 글에 매무새를 단정하게 고치고, 몇가지 내용들을 추가했습니다.


모바일에서는 아래 버튼을 누르면 카테고리로 바로 이동할 수 있어요 !

이동

맥 카카오톡 이미지 클립보드 붙여넣기가 안될때 해결

장장 3개월을 몰라서 포맷할까? 생각도 하고,, 엄청난 삽질을 했었다. 문제는 다음과 같다.

CMD + SHIFT 3, 4 + CTRL 을 통해 이미지를 클립보드에 저장하고 카카오톡에 붙여넣기를 하면 정상적으로 되질 않는다. 파일로 저장한 후 복사/붙여넣기 할때는 제대로 된다.

이유를 몰라 엄청 헤맸었는데 이유를 찾았다. 어떻게 찾았는지가 더 재밌는데 어제 자기전 상상속에서 생각을 하다가 CTF문제를 풀기위해 맥 스크린샷 포맷을 JPEG로 바꾼 것이 생각났다. 분명 비슷한 시기에 클립보드 붙여넣기가 안된거 같고. 이때 슬랙이나 다른 메신저로 붙여넣기는 정상적으로 되었다.. 하여튼 포맷을 PNG로 바꾸니깐 다시 잘 된다! 행복!

defaults write com.apple.screencapture type PNG

터미널에 위 명렁어를 치면 된다..

Screen Shot 2018-10-03 at 3.39.03 AM.PNG
근데 워드프레스는 붙여넣기가 안되네, 안습..

2018년의 절반하고도 한참을 지나서.

내일 CCE 예선 한다 ! 사실 그래서 잠이 안오는지 모르겠지만 요즘 인생 현타를 연쇄적으로 겪어 2018년을 다시 되돌아보려고 한다. 뭐, 얼마 남지도 않았구.

3월에 몇가지 적어둔게 있었다,, 지금 까지 얼마나 지켰고 또 못 지켰다면 프로그레스는 어느정도 인지 확인해보며 내 자신을 돌아볼 필요가 있을 것 같았다.

  1. 음주 조절하면서 하기.
  2. 한달에 한번씩 꼭 시간내서 여행 가기
  3. 나쁜말 쓰지 않기
  4. 브라우저 취약점 찾기
  5. 커널 취약점 찾기
  6. 컨퍼런스 CFP 제출해보기
  7. 30억 모으기

1번 부터 돌아보자, 분명 3월까지 망나니 인생에서 벗어난게 나의 의지였는지 아니면 단지 회사일이 바빴기 때문인지는 알 수 없지만, 술병걸려 고생한 기억은 없다.
뭐, 나름 만족한다. 나도 맛있는 술만 먹으려고 했고. 젤 걱정인건 접때 포항 내려가서 친구 만났을때, 한병 마시고 정신이 어질어질 했던 거다.. (이때 많은 민폐를 끼쳤다. 죄송합니다.)

— 워낙 감성이 예민한터라 알코올의 힘과, 새벽의 그,, 기운이 합쳐지면 주체를 못한다. 작은거에도 반응하고 피해의식도 갑자기 생겨지고 그러는 것 같다. 알면서도 주의 못하는게 아직 나이를 덜 먹어서 그런 것 같기두.. 시간 지나면 괜찮아질거라고 믿고 있다.


한달에 한번씩 시간내서 여행가기, 일반인 // 사무직 이라면 쉽지 않은 약속이다. 나는 자의 반 타의 반으로 한달에 한번씩은 여행을 갔던 것 같다. 잠깐이나마 쉴 수 있고, 새로운 경험과 사람을 만날 수 있는 기회였던 것 같다.

3월엔 커여운 다훈장과 오키나와 그리고 싱가폴을 함께 갔다. 싱가폴은 비오비에서 갔는데,, 머 나름 재밌었다. 칠리크랩이 정말 맛있었다. 블랙햇 컨퍼런스에 초점이 맞춰있다보니 (사실 놀러간것도 아니고) 여행을 하루밖에 할 수 없어 좀 아쉬웠다.

4월은 도연찡 만나러 다훈장과 부산 가서 잼께 놀았다. 원래 입사전에 어디 좀 박혀서 폐관수련 하려고 했지만 예정보다 (?) 일찍 들어가서 실패했다 ㅜㅡㅜ

5월은 뭐했지, 아마 대전의 달이었던 것 같다. 대전에 거의 살았다고 해야 되나 후..

6월엔 …

7월 8월 9월이 젤 많이 돌아 다녔네..

여름 휴가는 7월 말부터 8월 초까지 아부지랑 스페인 / 포르투갈 다녀왔고 (행복해따), 후 인생의 연인을 만날 수 있었는데 용기가 부족해서 말 몇마디 못걸었다 ㅜㅜ

데프콘 다녀와서 열심히 일하고.. HITB 갔다. 싱가폴 또 갔다. 이번엔 NSHC 다니시는 분이 열심히 서포트 해주셔서 재밌게 여행도 할 수 있었다.

그리고 9월.. 열심히 일만하려고 했지만, 좋은 트레이닝 // 컨퍼런스가 있어 하나 듣고 왔다. 이후에 취약점 찾는거에 대한 생각이 좀 생겨서 좋았다.


3번. “나쁜말 쓰지 않기”다. 불가능하다. 사람은 안변한다. 못한다. ㅠㅠ 컴퓨터 하면 힘들고 짜증나는 순간들이 너무 많아서 이를 소화 시키기 힘들다.. 누군가 정답을 안다면 알려주면 좋겠다.


4번. 비밀이다


5번. 비밀이다

비밀인건 절대 쓸말이 없고 귀찮아서가 아니다 !

6번. 음, 아직 낼만한 주제도 없고.. 사실 자신감이 없다. 우리가 프로젝트 한 이후로 다른 팀들에서 훨씬 좋은 성과를 많이 냈기에.. 유럽에도 냈다고 하시는데,, ㅠㅠ 자신이 없다 으으으

것보다 세한이형의 빈자리를 채우러 코드엔진가서 발표를 했다. 좋은 경험이었다. 분명 한정된 시간내에 내 모든 정보를 말하려고 하다보니 시간이 금방 갔다.. 다음엔 조금 더 잘 준비해야 될 것 같다 !

음, 코드엔진 덕분에 엠티도 가게되어서 날 이 자리까지 오게 한? 시발점인.. 누나를 만났다. 호에엥 신기하고 뭔가 고맙기도 하고 후.. 그냥 공부나 할껄이라는 후회도 밀려왔다.

7번. 고럼고럼 사람은 꿈을 크게 가지는게 좋은 것 같다 ~~~~


종합적으로 보면 뭔가 열심히 산 것 같은데, 나를 되돌아보는 시간이 부족했던 것 같다. 뭘 할지 시간표를 구상해보고 살아야 된다.. 너무 살도 쪄서 운동도 으쌰으쌰 해봐야 겠다 !

하ㅏㅏㅏㅏㅏㅏㅏㅏㅏ~~~~~~~ 즐겁다 ~~~~~~~~

Latest Gnuboard version XSS to SQL Injection

 “3월의 나” 계획(브라우저 해킹)을 해놓고 2월의 나는 어디에 써놓았는지 기억이 안난다. OS X Kernel을 부시기로 했는데 조만간 부실 수 있을것 같다. 대신 OS X, iOS에서 발생하는 Exploitable할것 같은 버그를 찾았다. 열심히 분석해야겠다. 월간 임준오가 쉬면 곤란하니깐 2월엔 GnuBoard 취약점을 공개하겠다.

Summary

 BoB 과제를 진행하면서 찾은 취약점이다. 작년 시큐인사이드에서 adm1nkyj가 냈던 문제의 취약점과 매우 유사하다. 그 문제의 취약점도 그누보드 모티브다. 여기서 중요한건 패치를 전부 해야되는데 한곳만 해서 유사한 코드나 벡터를 통해 한번더 0-day로 만들 수 있다는 점이다.
 관리자 페이지에서 발생한 SQL Injection이라 관리자 권한을 흭득하는 XSS가 필요하다. 물론 XSS도 찾았기 때문에 같이 설명하겠다.

Vulnerability

– XSS

듣기로 그누보드 관리자 페이지에는 무수히 많은 XSS취약점이 존재한다. serialization동작 없이 `echo $variable;`을 하다보니 당연할 수 밖에 없다. 소스코드 리뷰를 진행하니 금방 찾을 수 있었다. adm/mail_select_form.php 파일 71, 114줄에  취약점이 존재한다.

value="">

그누보드에서는 모든 피라미터에 addslash하여 XSS를 방어한다. html tag를 파싱할때 attribute안에 있는 \”는 “라고 인식하지 않고 attribute의 종료로 인식된다. 따라서 다음과 같은 상황이 발생한다.


value="\">alert(1);">

성공적으로 공격이 가능하다,, Chrome XSS Auditor를 Bypass하려면 약간의 Trick을 주면 된다.- SQL Injectionaddslash를 하기 때문에 basic한 sql injection이 발생한 가능성이 없다. 그러므로 advanced한 취약점을 찾아야하는데,, 작년에 adm1nkyj가 secuinside때 낸 문제가 떠올랐다. 그 문제도 그누보드를 사용한 third-party앱에서 찾은 취약점을 기반해 낸것이다. 관련된 코드를 찾으니 아직 패치가 되지 않은 한 부분이 있었다.. adm/auth_list_delete.php 파일 12~24줄을 보면 된다. 요약하면 다음과 같다.인자를 Array로 받는 로직중 그 Array의 값을 그대로 sql query에 사용했을때 발생하는 문제다.

$b = $_GET['b'];
for ($i=0; $i<strlen($a); $i++) {
    $query = "select * from table1 where a='{$a[i]}' and b='{$b}';";
}
b는 addslash때문에 sqlinjection이 불가능하다. a는 Array를 줘야한다. 하지만 a가 String이 되어 버리면 어떻게 될까? 1 byte씩 들어가기 때문에 \를 하나 넣을 수 있게된다. 그렇게 되면…

// a : \ → addslash → \\
// b: Attack Query
$query = "select * from table1 where a='\' and b='Attack Query#';";<span id="mce_SELREST_start" style="overflow:hidden;line-height:0;"></span>

따단..


업데이트

26th Mar.

크레딧 상태가 이상하지만, 뭐 .. 어쩔 수 없다.

커밋 로그를 살펴보니 admin 페이지 말고도 file board쪽에서도 하나 더 있었나 보다, 뭐 이런류의 취약점은 많을거라 생각한다.

오키나와 여행기

3월 3일 1일차

오후 1시 30분 비행기를 타고 오후 4시 30분정도에 나하 공항에 도착했다. 비가 많이 내려 착륙이 40분 정도 지연되었다. 공항에서 숙소까지는 한 20분정도가 소요되었다. 원래 버스를 타려고 했지만 버스 타는곳을 찾지 못했다. 뮌헨에서도 그렇고 버스타는건 어렵다. 결국 모노레일을 타고 Prefectrual Office역에서 하차했다. 숙소에 도착해 짐을 풀고 뒹굴대다가 밥을 먹으러 갔다. 가기 전 여러 맛집들이나 관광명소를 찾아보기 위해 네이버 블로그를 돌아본 결과, 길을 걷다 분위기가 좋은 집에 들어가라고 했다. 어디든지 다 맛있다고. 숙소 앞에 있는 라멘집을 선택했다. 라멘이 기름기가 많고 영양소가 풍부해 여행 첫날에 어올린다고 했다. 맛있게 먹고 그냥 숙소에 들어가기 아쉬워 마트에가 생수와 간식을 샀다. 숙소에서 목욕하고 뒹굴대다가 잠에 들었다. 일본은 작은 집이라도 모두 욕조가 있어 좋은것 같다. 따듯한 물에 몸을 담구는건 언제든 좋아.

부릉 부릉

첫날 먹었던 라멘

3월 4일 2일차

새벽 7시쯤에 잠에서 깼다. 12시쯤 완벽하게 잠에서 깰 수 있었는데, 잠을 설친 탓인지 씻다가 코피가 났다. 츄라우미 수족관과 코끼리 바위로 알려진 만좌모등을 둘러보기위해 계획을 짰다. 그런데 오키나와섬의 북부라 내가 있는 숙소와는 2시간 이상 차이가 난다. 마치 제주도의 제주시와 서귀포시의 차이 정도이다. 절망하고 있는 사이 네이버 지식인에 버스투어를 추천하는 답변을 보았다. 당장 알아보았다. 이런, 예약이 모두 마감되거나 3일전 예약이라 우리가 오키나와에 있는 동안은 이용할 수 가 없었다. 절망에 빠져있던 우리를 구해준건 한 여행사였다. 화요일에 예약이 가능했다! 화요일은 비도 안오고 좋은 날씨기에 기분이 좋았다. 예약을 한후 아침이자 점심이자 저녁을 16시에 먹으러 나갔다. 일본은 스테이크가 비교적 한국에 비해 저렴하기 때문에 많이들 먹는다. 우리는 랍스터와 스테이크 세트 2개와 안심 스테이크 1개를 시켰다. 물도 기본적으로 제공해줘서 행복했다. 스테이크는 진짜 환상적이었다. 굽기는 미디움으로 했는데 미디움 레어에 비해 더 맛있었던것 같다. 안심이 미디움이었다. 맛있게 밥을 먹고 바다를 보러 나미노우에 해변에 갔다. 바다 가는길에 신사가 있어 잠깐 들렀다. 소원과 함께 기도를 드린 후 오미쿠지를 뽑으러 갔다. 중길이 나왔는데 가장 인상깊었던건 Always remain honest. 서양 관광객들도 많이 보이고 일본 아이들 산책나온 노부부들 데이트하러온 연인들이 보였다. 그들은 모두 행복해 보였다. 후후, 나도 나중에 여자친구랑 오고싶다. 바다에 발을 담궈보였다. 아직은 차다. 내 인생처럼 아직 화창한 여름이 되려면 조금 남은것이다! 돌아오는 길에 여러 정원들 공원들을 살펴보았다. 오는길에 인상적인 이쁜 식당을 보았다! 숙소에 들어와 잠시 휴식을 취한 후 국제거리를 향했다. 국제거리는 동양의 하와이라고 불리우는 곳이다. 나하공항에 도착했을때 놀랐던건 야자수가 있다는 것이다. 국제거리 곳곳에 야자수들이 심어져 있어 하와이를 연상케한다. 아, 숙소 주변엔 한국분들이 안계셨는데 국제거리에는 이곳 저곳에서 한국어가 들려왔다. 포장마차 거리에서 저녁을 먹으려 했는데 앞까지 가서 먹을것이 별로 없는것과 다훈이형이 배가 안고파 그냥 나왔다 ㅜㅜ. 돈키호테 구경하고 녹차맛 엔초맛 아이스크림을 입에 물고 숙소를 행했다. 아 참, 돌아오는 길에 패밀리마트에서 아침에 먹을 컵라면과 저녁에 먹을 맥주와 도시락을 샀다! 여행을 하면 즐거운 이유가 내일은 또 무얼 할지 설레는 마음으로 잠자리에 들 수 있어서인것 같다. 한국에 돌아가면 이런 마음가짐으로 인생을 조금 더 열심히 살아봐야겠다. 이제 씻고 잘거다. 자기전에 컴퓨터 하다가 7공주가 슈가맨에 나온것을 보았다. 오인영씨의 인스타와 페이스북을 보며 느낀건, 모든걸 가졌는데도 자기 자신에 부족하다 느끼고 열심히 하는 사람이란 것이다. 이렇지 못한 내 자신에 반성한다. 현재 삶에 안주하지 말고 항상 최선을 다해야겠다.

먹었던 스테이크

오마쿠지

가는 길에 벗꽃 이뻐서..

해변

퐁당

3월 5일 3일차

아침 부터 비가 내린다. 아침은 어제 사온 우동을 먹고 4시-5시까지 침대에서 뒹굴었다.. 류보 백화점의 포켓몬 스토어를 갔다. 귀여운 포켓몬들이 참 많았다. 잠만보 인형과 미니레고를 구매했다. 국제거리의 포장마차 거리에서 솜사탕 스키야키로 저녁을 먹은 후 돈키호테에서 물건들을 샀다.. 시간이 지나고 쓰는 글이라 기억이 가물가물하다.. 무료하게 시간을 보내고 숙소에서 휴식을 취하며 내일 있을 버스 투어를 준비했다.

맛있었다

잠만보

솜사탕 스키야키, 녹고나서 먹으면 된다

가리비 요리.. 맛있다

3월 6일 4일차

오늘은 오키나와 북부 버스투어가 있는 날이다. 7시 기상을 해야하는데 전날 너무 늦게 잠자리에 들어 힘들었다. 버스투어는 이틀전인 일요일날 예약했었다. 여행을 시작할때 랜드마크들이 몰려있는 북부에 대중교통이나 렌트카를 통해 가려고 했었다. 렌트카는 국제 운전 면허가 없기에 불가능 했고 대중교통은 시간도 시간이지만 비용이 너무 비쌌다. 왕복 인당 4천엔 정도. 그래서 교통비와 랜드마크 입장료가 포함되고 길라잡이와 함께하는 버스투어를 선택했다. 둘이합쳐서 11만원에 다녀왔다. 류보백화점에서 탑승해 T-Gallery, 아메리칸 빌리지를 거쳐 첫 목적지인 추라우미 수족관에 도착했다. 고래상어로 유명하다고 한다. 11시에 시작하는 돌고래 쇼를 관람했다. 길라잡이분이 말하시길, 어떤 분들은 돌고래를 학대하는거지 않냐, 라고 하시는분들이 계시다고 했다. 돌고래는 아이큐가 높은 동물이기에 스트레스를 받으면 자살을 하게 된다. 하지만 쇼를 호스트하는 돌고래들은 자살 하지 않고 평균이상으로 장수하고 있다고 한다. 뭐 다들 맞춰살아가는게 아니겠는가. 수족관 안으로 들어가 여러가지 신비한 생물들을 보고 가장 귀여운 가오리도 보았다. 출구 바로 앞에 듀공과 바다거북이가 사는 곳이 있다. 듀공 또한 너무 귀엽다 흑흑.. 점심시간이 되어 무얼 먹을까 고민하다 버스에서 내렸던 샌츄리온 호텔 뷔페를 가기로 했다. 맛은, 별로였다. 아니 먹는게 힘들었다. 흑흑.. 이런 뷔페를 4만원이나 주고 먹다니… 암튼 밥의 여파였을까 여행 내내 조금 골골 되었다. 두번째 목적지는 코우리 대교다. 바다 풍경이 참 이쁘다. 다리위에서 바다를 보면 얕아보이는데 물이 맑아서 그렇다고 한다. 얕은곳도 3~4M고 깊은곳은 수십M라고 한다. 다리 아래에 해변이 있다. 해변을 돌아다니다가 용진이 동생을 보았다 ㅋㅋㅋ. 오키나와는 섬이라 다양한 소금이 많이 생산된다고 했다. 그래서 그런지 소금맛 아이스크림도 있다. 블루씰이란 아이스크림가게에서 소금과 바닐라를 먹었다. 한 40분 버스를 탔나 파인애플 파크에 도착했다. 입구에서 사진을 찍어주는데 추라우미 수족관처럼 무료로 주지 않고 다 사야한다. 너무 비싸다 !!! 입장하면 무인 자동차를 타고 공원 내부를 둘러볼 수 있는데 움직이는게 신기하다. 분명 바닥엔 센서같은게 없어보이는데 자동으로 움직인다.. Self-Driving Car 기술이 이런 공원까지 들어오다니.. 뭐 아무튼 원리를 찾지 못했다.. 차간 간격도 잘 유지하고 신기하다. 공원 출구에는 어디에서나 볼 수 있는 기념품 판매점이 있다. 파인애플 파크에는 색다른점이 있는데, 모든 기념품을 체험하고 시식해볼 수 있다는것이다. 파인애플 파크에서 재배한 파인애플로 만든 여러가지 음식이 눈에 띄었다. 난 그중에서도 파인애플 레드 와인이 젤 맛있었다. 아 참 중간에 오마쿠지 비슷한게 있어서 뽑았는데 온통 일본어로 되어있었다. 길라집이분에게 부탁드리니 읽어주셨다. 꼭 성공한다고 하시더라 대길이라고. ㅎㅎㅋ 열심히 살아야징. 마지막 장소인 만좌모로 향했다. 만좌모는 만명이 앉을 수 있을만큼 넓다고 이름이 붙어진거다. 괜찮아 사랑이야 촬영지이기도 하다. 실제로 만좌모 위에는 못가보고 건너편 절벽에서 볼 수 있었다. 어딜가나 그렇듯 중국인들이 진짜 많았다. 사진 찍기도 힘들어서 진짜 대충 찍었다. 아, 그리고 바닷가라 그랬는지 몰라도 바람이 엄청 불었다. 셔츠를 안챙겨갔으면 감기에 걸렸겠지.. 우리의 버스투어는 여기까지다. 하지만 중간에 아메리칸 빌리지에서 내릴 수 있어 둘러보기로 했다. 사실 가장 큰 목적은 관람차를 타는것이었다. 어릴때 에버랜드에서 탄것 말고는 한국에서 타본적이 없어 항상 관람차에 대한 욕구가 강했다. 베가스에서도 하이롤러를 탔듯이 아메리칸 빌리지에서도 관람차를 탔다. 분명 줄이 있을것 같았는데 다행이 사람이 없어 바로 탈 수 있었다. 야경이 진짜 멋있었다. 저녁은 타코라이스라는것을 먹었다. 맛은 평범했다. 스시는 한국에서 하도 먹었기에 이번 여행에 먹지 않았나 싶다. 택시에 힘든 몸을 싣고 숙소로 향했다. 짐 정리를 하고 잠에 들었다.

커여운 돌고래

코우리 대교

소금 바닐라맛 아이스크림

무인으로 운행되는 자동차들..

타코 라이스

아메리칸 빌리지에서

3월 7일 5일차, 마지막 날.

오늘은 한국가는 날이다. 비행기는 4시 35분. 체크아웃은 12시. 그 동안 할게 필요했다. 원래 내 계획은 슈리성이나 나하에서 가까운 관광지를 둘러보는 것이었는데 늦게 일어나기도 했고 시간도 없을것 같아서 점심만 먹고 공항 가기로 했다. 야키니쿠를 먹으려 했지만 밤 부터 열기에 첫날 봐둔 텐동집에 갔다. 텐동과 츠케멘 세트를 시켰다. ㅎ후 맛이 아주 좋았다. 배불러서 얼마 먹지 못한게 참 아쉽다. 공항은 모노레일을 타고 갔다. 나하 공항은 무척 작았다. 체크인 카운터도 2개밖에 없었다. 하나를 두 항공사가 나눠써 3개까지 만들어졌네 1시쯤 가면 30분 기다리고 체크인 할 수 있을줄 알았는데 2시간 전부터 열린다. 카페에서 한참 시간을 보내다 수속을 마치고 면세점 안으로 들어갔다. 면세점도 작았다.. 가는 비행기도 30분 딜레이 되었다.. 보딩하자마자 잠에들어 순식간에 인천공항에 도착했다. 계절밥상에서 저녁 먹으려고 했는데 찾지 못해 뚜레쥬르에서 간단하게 밥을 먹었다!

텐동과 츠케멘

인천 저녁

만든것

끝으로,,

여행을 하면 항상 배우는게 많다. 번뜩이는 아이디어도 몇개 떠오르고, 여행 관련 서비스 아이디어도 하나 생각났다. 지금 까지 나온 서비스들의 단점이랄까.. 불편한점을 최소한 것이다. 뭐 암튼 휴양에 가까운 여행이었는데 나름 버스투어도 예약하고 알차게 보냈던것 같다!!! 다다음주에 싱가폴 가는데 (여행은 아니지만,,) 재미있었으면 좋겠다! 아니 여행은 항상 즐거워 !

여행을 하면 즐거운 이유가 내일은 또 무얼 할지 설레는 마음으로 잠자리에 들 수 있어서인것 같다. 한국에 돌아가면 이런 마음가짐으로 인생을 조금 더 열심히 살아봐야겠다. 이제 씻고 잘거다.

이 부분이 가장 맘에 돈다 !!

잘자렴 여러분~~

Attack Block Chain Node’s JSON RPC with Efficient DNS Rebinding Attack

 구글의 타비스가 Blizzard 앱에서RPC auth mechanism이 DNS Rebinding를 통해 공격이[1] 가능하다는것을 언급했다. 며칠 뒤 페이스북이랑 트위터에서 geth(go-ethereum) RPC와 몇가지 블록체인 노드들의 RPC에 DNS Rebinding Attack이 가능하다는 여러가지 이야기가 들려왔다.
 우선 이더리움 Geth에서 비오비 프로젝트를 하면서우리 팀이 찾았던 CORS이슈와 제시했던 패치 방안과 대해서 설명한다. 타 블록체인 노드에서 발생한 0-day 그리고 공격에 사용되었던 효율적인 DNS Rebinding Attack을 소개한다.

DNS Rebinding Attack

 0ctf 2016의 Monkey 문제가 DNS Rebinding Attack을 소개하는 글중에 하나이다. [7] 아마 이 문제 이후에 용진이형이 알려줬었다. 더 알아보고 싶으면 용휘형이 예전에 번역했던 글을 참고해서 읽어도 좋다. (http://gooverto.tistory.com/entry/the-power-of-dns-rebinding-stealing-wifi-passwords-with-a-website-translated) 일반적으로 말하는 DNS Rebinding Attack Browser의 SOP를 우회하기 위한 기술중 하나이다. 플로우차트를 그려보면 다음과 같다.
1. junoim.kr을 NS에 요청하면 174.138.24.108을 반환한다.
2. 네임서버의 레코드를 빠르게 바꾸고 브라우저에서 DNS Cache가 flush될때까지 기다린다.
3. 그 후 NS에 요청을 보내면 127.0.0.1을 반환하게 된다.
이러한 요청은 브라우저에서 domain뿐만 아니라 ip까지 확인하면 되지만 벤더사들은 클라이언트 단에서 미티게이션을 추가하는것은 false negative한 case들 때문에 불가능하다고 생각해 wontfix처리 했다. [2]
위 방법을 사용하면 브라우저의 DNS Cache가 비워질때까지 기다려야 하기 때문에 60초가 필요하다. 뭐 eviction을 하면서 다른 값으로 덮어서 없앨 수도 있는데 그래도 20초 이상이 필요하다. optimization을 하기 위해 사용한 방법은 다음과 같다.
0. 도메인의 A레코드에 정상적인 서버의 아이피와 127.0.0.1를 등록해둔다. (with order fixed option)
1. junoim.kr을 NS에 요청하면 174.138.24.108을 반환한다.
2. 첫 요청이 들어오면 서버를 끄던가 요청된 IP를 iptables를 이용해 블락한다.
3. 브라우저에서 바로 다음 요청을 보내면 공격자의 서버에서는 TCP RST 패킷을 보내게 된다.

4. RST 패킷을 받으면 브라우저에서는 다음 레코드를 사용하게 된다. (127.0.0.1)

Tendermint Node RPC 0-day

 떡락이의 블록체인연구소 (https://www.facebook.com/blockchain.gazua/) 에서 tendermint를 언급한적이 있다. 뭐.. 자세한건 안봐서 모르겠지만 얘도 노드를 사용한다 ! RPC 통신도 지원한다!
tendermint.exe node –proxy_app=dummy
명령어를 통해 실행할 수 있다. 데모 영상이다.

Mitigation

 매우 간단한 패치로 공격을 막을 수 있다. 서버 측에서 Request측의 IP와 HTTP 헤더의 host, origin를 검사하면 된다. 이런식으로 패치해도 타 process에서 보내거나 extension에서 보내게 되면 막을 방법이 없기 때문에 신뢰할 수 있는 종단간 암호화를 통한 인증과정을 도입시켜야 된다. e.g.) username/password

Others

Ethereum Geth RPC에 Dns Rebinding Attack 문제는 오래전 부터 있었다. [4], [8] 물론 비슷한 케이스로 CORS Bypass 문제도 있었다. 비오비 프로젝트를 하면서 찾은 취약점 중에 하나인데 바운티에 신고를 했을때 다음과 같은 답장이 왔었다.
This is actually a known issue, one of the first we got via the bug bounty program. Nevertheless, we’ve decided to change the behaviour, but we won’t change anything before Byzantium: since people will be forced to update for the fork, we don’t want to force a potentially breaking API-change on people/businesses.
2016년에 이미 관련된 이슈가 제보 되었다는걸 알려주었다. 뭐 CORS 이슈라 아래와 같이 패치방안을 제공해주었다. 사실 이대로만 패치 되었더라도 DNS Rebinding Attack은 바로 막히는데 아쉽다.
if not request.headers['origin'] in allowedOrigin:
    return Error("WTF! your origin is not in allowedOrigin list.")

Victim의 Public IP Address를 모르는 상황에서 공격하는 시나리오였기 때문에 요청한 IP Address를 검사하는 로직도 추가되어야 한다. (0.0.0.0로 바인드 하는 상황이면)위와 비슷하게 Cisco Talos가 Parity 에서도 동일한 취약점을 찾았다. [9]

Ref

신한카드 이용대금 명세서 개인 비밀번호 분석 및 크랙

오랫만에 메일함을 들어갔더니 “[신한카드] 임준오님의 01월10일 체크카드 이용대금 명세서입니다.” 이런 제목의 메일이 와있었다. 예전에도 몇번 받아봤는데 첨부파일에 html파일이 있고 생년월일을 입력하면 명세서를 보여주는 형식이었다.

메일 화면

보안 이메일 명세서라고 나와있는데 얼마나 안전한가 한번 시험해보고 싶었다.

생년월일을 받는다.
내 생년월일을 입력하면 정상적으로 열리게 된다.

이제 소스를 열어보자.

뭔가 난독화가 많이 되어 있다. 일단 beautify 를 해보자.

이제 좀 보인다. 분석을 시작하자!

1. 생년월일을 비교하는 부분을 찾는다.

2. 연산하는 곳을 찾는다.

3. 복호화 코드를 짠다.

이 순으로 분석을 하면 될것 같다.

1. 생년월일을 비교하는 부분을 찾는다.

어떻게 찾을까 생각해봤는데 생년월일이 일치하지 않으면 아래와 같은 alert 창을 띄운다.

저 문자열을 찾아가면 될것 같다.

근데 난독화가 되어있어 alert 함수나 띄우는 문자열을 찾을 수 없었다.

약간의 감을 통해 최상단에 있는 문자열 배열이 함수명이나 메시지들을 담고 있을것 같았다.

엇.. alert가 있다…?

기억을 더듬어 보니 alert가 무려 17개나 있어 문자열로 찾았던 기억이 난다.

그럼 이제 저 지점에 브레이크포인트를 걸고 동적 디버깅을 해보자!

1234를 넣고 상황을 지켜보았다.

1345번째 줄을 보면 _0x9319xd9(함수의 인자) 변수에 내 비밀번호가 들어왔고 1348번째 줄에서 _0x9319xdf함수의 인자로 넘어갔다. 그럼 _0x9319xdf 함수가 복호화하는 함수다 !

2. 연산하는 곳을 찾는다.

1354번째 줄에서 _0x9319xde에 복호화한 값이 들어갔다.

복호화하는 로직을 보니 고정된 키를 사용하는것이 아닌 인풋을 키로 하여 복호화를 진행한다. 복호화 하는 함수를 조금더 분석해보자.

flow: _0x9319xdf -> _0x9319xe2 -> _0x9319xe2

불러오는 함수를 계속 따라가 보면 _0x9319xe4에 “SEED-CBC”란 값을 넣는걸 볼 수 있다.

SEED-CBC를 사용한다고 알려준다. SEED-CBC의 상세한 로직은 이미 쓰고 있는 곳들이 많아 안전할거라 생각하고 따로 분석하지 않았다.

3. 복호화 코드를 짠다.

내가 준 인풋(사용자의 생년월일)을 키로 사용하고 SEED-CBC 블록암호를 사용하기 때문에 복호화 코드를 짜도 의미가 없다. 아니 이미 복호화 해주는 코드는 내장되어 있다. 단지 키를 정의할 수 없을 뿐이다.

키를 구해야 되기 때문에 브루트포싱밖에 답이 없다. 하지만 복호화 하려는 데이터가 너무 크기때문에 1초정도 걸린다.

대충 계산 해보면..

1년을 365로 가정하고 카드 사용자층을 10대 ~ 60대로 선정하면 총 60년을 상대로 브루트포싱해야됨.

그러면 최종적으로 1s * 365 * 60 = 21900s = ~6시간

한개를 복호화 하는데 6시간이나 필요하다. 물론 쓰레딩으로 처리하면 줄일 수 있겠지만 현저히 많은 시간이다.

그러면 과연 더 나은 방법이 없을까?

생각 하던중 정상적으로 복호화 되었는지의 여부를 판별하는 곳을 보았다.

xxx(0, 10) == aaaaa

어.. 복호화된 앞 부분에서 비교를 한다라 .. ?

수 많은 블록을 한 블록으로 줄일 수 있게 되었다.

UNISAFESMAIL_DATA = btoa(atob(UNISAFESMAIL_DATA).substr(0, 16));

한 블록으로 줄인 후 브루트포스 코드를 구현했다.

완성된 브루트포스 코드는 아래와 같다.

function brutePassword() {
    for (var year=50; year<100; year++) {
        for (var month=1; month<=12; month++) {
            var tmp = month+"";
            if (tmp.length == 1)
                tmp = "0"+tmp;
            month = tmp;
            for (var day=1; day<=31; day++) {
                var tmp = day+"";
                if (tmp.length == 1)
                    tmp = "0"+tmp;
                day = tmp;
                isSuccess = new UniSafeMail().unisafe_smail_process(year+month+day);
                if (isSuccess) {
                    console.log(year+month+day);
                    return year+month+day;
                }
            }
        }
    }
}