웹페이지에 크로스 사이트 스크립트(XSS) 공격이 가능하다면 쿠키값을 가져올 수 있다. 즉 공격자가 쿠키에 접근이 가능해 진다.


이를 막기위해 HttpOnly라는 속성이 등장했다.


서버에 SetCookie 헤더를 보낼때 HttpOnly 옵션을 주어 쿠키 접근을 방지할 수 있다.


다음은 php를 통한 HttpOnly 속성의 예시이다.






* httpOnly 설정 방법


- PHP


5.2 이상버전

setcookie("name","value",0,"/","domain_name",false,true); 


5.2 이하버전

header( "Set-Cookie: name=value; httpOnly" );


- JSP


java에서 설정

String sessionid=request.getsession().getId();

response.setHeader("SET-COOKIE","JSESSIONID",+sessionid+";HttpOnly");


web.xml에서 설정

<session-config>

<cookie-config>

<http-only>true</http-only>

</cookie-config>

</session-config>


- ASP


HttpCookie cookie = new HttpCookie("cookie", DateTime.Now.ToString());

cookie.Name = "cookie";

cookie.HttpOnly = true;


readme.txt를 읽어보면 시리얼값이 76876-77776일때의 password를 구하라고 한다. 그리고 password의 마지막 값은 'p'이다.



실행해보니 Wrong이라고 나와서 Wrong을 출력해주는 부분을 찾아가 보았다. 시리얼값의 포맷은 xxxxx-xxxxx이다.




sub_401740 함수의 리턴값이 1이면 Correct를 띄워줘서 sub_401740 함수를 분석해 보았다.




제일 처음에 필터링 하는 부분은 password값이다. 4글자여야 하고 알파벳 소문자여야 한다.


그리고 본격적으로 password값을 연산해  시리얼값을 만들어낸다.


먼저 생소한 함수를 찾아보았다.


GetAt(char* a1, int a2) : 문자열 a1의 a2번째 인덱스의 값을 반환해 준다.

 

먼저 if문으로 값을 검증하는 루틴 10개가 있다. 시리얼 값도 '-'를 제외하면 10자리 이므로 이부분에서 시리얼 값을 만들고 비교한다는것을 알았다.


v61은 password이므로 한자리씩 갖고와서 shift연산, and연산등을 통해서 내가 입력한 시리얼 값과 비교를 한다.


예를들어 if(v13==v12) 이부분은 v12는 내가 입력한 시리얼값의 첫번째 인덱스, v13은 password를 연산해 나온 시리얼 값의 첫번째 인덱스이다.


이런식으로 10자리가 전부 맞아야 1을 반환해준다.


password : xxxx

serial :xxxxx-xxxxx


크게보면 password값 1,2,번째 값을 통해 시리얼값 '-' 앞부분 5자리를 만들어내고 password값 4,5번째 값을 통해 시리얼값 '-' 뒷부분 5자리를 만들어 낸다.


연산하는 부분을 참고해 코드를 짜보았다.






어떤 사람이 bruteforce 해주는 툴을 만들었다.


아직 핸들, 윈도우메시지등 win32 api는 생소하니 좀더 공부해본후 내가 직접 만들어야 할거같다.



#include <iostream>
#include <Windows.h>
using namespace std;
void bruteForce(HWND hwndName, HWND hwndOutput)
{
   wchar_t inputName[5] = L"xxxp";
   wchar_t output[10];
   cout << "Correct Names:" << endl;
   for (int i = 0x61; i < 0x7B; i++)
      for (int j = 0x61; j < 0x7B; j++)
         for (int k = 0x61; k < 0x7B; k++)
         {
            inputName[0] = i;
            inputName[1] = j;
            inputName[2] = k;
            SendMessage(hwndName, WM_SETTEXT, 0, (LPARAM)inputName);
            SendMessage(hwndOutput, WM_GETTEXT, 10, (LPARAM)output);
            if ((char)output[0] != 'W')
               wcout << inputName << endl;
         }
}
int main() {
   cout << "##############################################"<< endl << endl;
   cout << "[Reversing.kr] Position Bruteforcer" << endl;
   cout << "by 거북찡 http://blog.naver.com/7005ye" << endl << endl;
   cout << "##############################################" << endl << endl;
   HWND hwnd;
   wchar_t serial[12] = L"76876-77776";
   if ((hwnd = FindWindow(NULL, L"Position")) != NULL)
   {
      HWND hwndName = FindWindowEx(hwnd, NULL, L"EDIT", NULL);
      HWND hwndSerial = FindWindowEx(hwnd, hwndName, L"EDIT", NULL);
      HWND hwndOutput = FindWindowEx(hwnd, NULL, L"STATIC", NULL);
      SendMessage(hwndSerial, WM_SETTEXT, 0, (LPARAM)serial);
      cout << "Bruteforcing for serial# "; wcout << serial << endl;
      bruteForce(hwndName, hwndOutput);
   }
   else
      cout << "Position 캡션 감지 실패. 프로그램을 종료합니다" << endl;
   system("PAUSE");
   return 0;
}

출처 : http://blog.naver.com/7005ye/220690081917


'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr x64 Lotto  (0) 2016.10.06
Reversing.kr HateIntel  (0) 2016.10.05
Reversing.kr Music Player  (0) 2016.10.04
Reversing.kr Direct3D FPS  (0) 2016.09.01


제어판 - 프로그램 - 프로그램 및 기능 - windows 기능 사용/사용 안함



인터넷 정보 서비스 체크



http://localhost -> IIS가 정상적으로 서비스 되는것을 볼 수 있다. 




웹 서버의 루트 디렉토리 C:\\inetpub\wwwroot 에 test.asp 만들면 웹페이지가 정상적으로 동작한다.




한글이 깨질 경우 호환성 보기를 활성화 한다.





루트 디렉토리를 변경하고 싶은경우


제어판 - 관리도구 - IIS(인터넷 정보 서비스)관리자



default web site 체크 후 고급설정 클릭




실제 경로를 원하는 경로로 변경해주면 된다.

 

모든 설명은 windows 7 기준이다.



'' 카테고리의 다른 글

LetsEncrypt Certificate Auto Renewal  (0) 2021.01.19
bypass file upload restrictions (filename extension)  (0) 2016.10.17
HttpOnly Vulnerability  (0) 2016.09.30
strcmp vulnerability on php  (0) 2016.09.19
Directory Listing denied on Apache  (0) 2016.09.19

<?

        $str="hacked";

        if(strcmp($str,$_GET['param'])==0)

                echo "good";

        else

                echo "bad";

?>



당연한 결과이다.


그러나 php에서 strcmp는 배열과 비교를 하면 취약점이 발생한다.






post로 넘겼을때 burp suite를 통해 parameter값을 변조하는 방법이다.






해결책은 ==와 같은 느슨한 비교 말고 === 같은 엄격한 비교.


또는 is_string, is_array 같은 함수를 통한 입력값 검증.


이 취약점은 php 5.3 버전 이상부터 발생한다.






index.php 같은 파일을 설정햇을때  index.php가 존재하지 않는 경우 위와 같이 입력하면 디렉토리 리스팅 취약점이 발생한다.


이를 방지하기 위해 apache 웹 서버를 사용하는 경우 /etc/apache2/apache2.conf 파일에서



Indexes를 지워준다


그리고 웹서버를 재시작 한다.


/etc/init.d/apache2 restart





실행을 시켜보니 username과 authCode를 입력받는다



디컴파일을 해보니 sub_4014A0함수에서 username과 authCode를 검사하는듯 하다.




주석으로 처리해 놓았는데 첫번째 do-while문에서는 username이 RingZer0인지 검증을 한다.


두번째 do-while문에서는 authCode의 길이가 15자 인지를 검증한다.


마지막 while문에서는 authCode의 값들이 '0'~'9'중에 있는지를 검증한 후 


sub_401334와 sub401450함수를 차례로 호출한 후 최종적으로 v10[4]==v19[17]가 참이어야지 인증에 성공하는 프로그램이다.


sub_401334함수는 a1(username)이 정해져 있기 때문에 분석할 필요가 없고 sub_401450함수만 분석하면 될듯하다.



 분석해 보면 15자리의 authCode를 3자리씩 잘라서 3개의 값들을 연산을 통해 총 5회 반복하여 크기 5의 문자열을 만들어낸다.


그리고 반환된 문자열을 앞서 반환된 문자열의 v9[1],v9[5],v9[8],v9[14],v9[17] 인덱스와 비교를 한다.


 디버깅을 통해 각각의 값은 0x98 0x97 0x78 0x0f 0x15 이다.


한번에 authCode의 3자리씩 알아낼 수 있으므로 간단한 코딩을 하면 문제가 풀린다.










'문제 > RingZeroTeam' 카테고리의 다른 글

RingZer0Team XSS Challenge 2  (0) 2016.10.20
RingZer0Team Windows API for the win!  (0) 2016.09.06


다운 받으면 exe파일 하나를 준다



디컴파일을 해보면 입력값이 &unk_403065와 같으면 ShowFlag함수가 실행된다.


인자값으로 입력값이 들어가는 것을 보아 if문을 우회해서 함수를 실행시키는게 아니라 


원하는 입력값을 입력해야만 옳은 Flag가 나올것으로 보인다.


 &unk_403065의 값이다.

입력값과 v11을 xor연산 하는것을 보니 v11의 값을 알아야 하는데 v11은 GetK 함수들을 통해 생성되는 것으로 보인다.


디버깅을 통해 v11에 들어가는 값을 보니


GetK1 = 8

GetK2 = -56

GetK3 = 24

GetK4 = 40

GetK5 = -72

GetK6 = -24


이런식으로 나왔다.


입력값을 알아내기위해 v11과 &unk_403065를 한바이트씩 xor연산을 통해 출력을 하면 값이 나온다.



참고로 디버깅을 하다가 getk6함수에서 GlobalHandle함수만 호출하면 프로그램이 죽었다.



GlobalHandle함수에 대해 검색을 해보니 확실한 원인은 찾지 못했지만 


옛날에 window7이 나온지 얼마 안됬을 때 피카츄배구가 window7에서 안돌아가서 win7호환용으로 따로 피카츄 배구가 있었다고 한다.


xp용과 7호환용의 차이점을 보니 win7호환용에서는 이 함수를 쓰지 않았다고 한다.


정확히는 모르지만 그냥 이 함수는 쓰면 안될거 같아서 함수 호출하는 부분을 NOP 처리하고 풀었다.


근데 실행하면 되는데 디버깅하면 왜 안되는지 모르겠다.


Windows API can be painful some time. 라고 문제에 써있어서 GlobalHandle함수가 문제인것은 확실한것 같다.



'문제 > RingZeroTeam' 카테고리의 다른 글

RingZer0Team XSS Challenge 2  (0) 2016.10.20
RingZer0Team RingZer0 Authenticator  (0) 2016.09.06


먼저 실행을 하니 몬스터들이 있고 몬스터들을 만나면 HP가 0이되어 죽는다.



IDA를 통해 문자열들을 보니 Game Clear라는 문자열을 발견했고 그 문자열이 사용되는 함수를 찾아보았다.




이 함수로 들어가면 조건이 맞을 때 MessageBox함수를 호출하는데 디버깅을 통해 강제로 메시지 창을 띄우니 이렇게 나왔다.




이상한 값은 IDA를 통해 봤을 때 &byte_407028에 있는 문자열인데 강제로 메시지 박스를 띄웠기 때문에 이런식으로 나온다 생각했다.


옳은 방법을 통해 일정 점수를 넘겼을 때 &byte_407028의 문자열이 연산을 통해 바뀔거라 생각했고 &byte_407028의 문자열이 사용된 부분들을 찾아봤다.



메인함수에서 이 함수를 호출 하는데 조건에 만족할때마다 XOR연산을 통해 문자하나씩 바꿔준다.


디버깅을 통해 이 함수에 브레이크 포인트를 걸고 함수를 실행해보니 



이 문자들과 0에서 부터 시작해 4씩 증가되면서 XOR연산을 하는것을 발견했다.








'문제 > Reversing.kr' 카테고리의 다른 글

Reversing.kr Ransomware  (0) 2017.01.21
Reversing.kr x64 Lotto  (0) 2016.10.06
Reversing.kr HateIntel  (0) 2016.10.05
Reversing.kr Music Player  (0) 2016.10.04
Reversing.kr Position  (0) 2016.09.30

[ls]


vi ~/.bash_profile{

alias ls='ls -FG'

}

-F : 디렉토리에는 '/' 실행파일에는 '*' 심볼릭링크파일에는 '@' 등을 표시 해주는 옵션

-G : 색상을 사용하겠다는 옵션


source ~/.bash_profile




[vi]


cp /usr/share/vim/vim73/vimrc_example.vim ~/.vimrc


- 소스 코드등 vi 편집기에서 색상을 표시해줌

'' 카테고리의 다른 글

Ooops, IDA has almost crashed!  (0) 2019.01.28
ssh connection errors  (0) 2016.08.31
How To use Scp For Mac  (0) 2016.08.25


이런식으로 잘 접속 하던 서버에 ssh 접속이 안될때가 있다.


이런 경우는 사용 하던 서버에 ssh를 재설치 했거나 가상머신에 OS를 재설치 했을 때 IP가 동일할 경우 일어난다.


ssh-keygen -R IP 


이 명령어를 실행하고 다시 ssh 접속을 시도하면 정상적으로 접속이 된다.


이 에러는 MAC과 LINUX에서만 발생한다고 한다.




'' 카테고리의 다른 글

Ooops, IDA has almost crashed!  (0) 2019.01.28
Color highlighted on the Mac Terminal  (0) 2016.09.01
How To use Scp For Mac  (0) 2016.08.25

+ Recent posts