Front-end_dev

login brute forcing 본문

Security

login brute forcing

Eat2go 2018. 12. 20. 04:46

Login brute forcing (로그인 브루트포싱) 알고리즘


1.  비밀번호 생성 알고리즘.


경우의 수는 7가지이다.

  1. 숫자10개로만구성
  2. 영어소문자(26)로만 구성
  3. 영어대문자(26)로만 구성
  4. 숫자10 + 소문자26 = 36
  5. 숫자10 + 대문자26 = 36
  6. 소문자26 + 대문자26 = 52
  7. 숫자10 + 소문자26 + 대문자26 = 62

2.  브루트포싱 알고리즘

  1. 찾으려고하는 패스워드의 길이만큼 루프를 돌린다  예를들어, 패스워드가 1234라면 숫자로만 구성되어있으므로 for-loop 4 중첩되며 루프는 10번씩 반복하게된다. 따라서 10^4만큼 돌게된다.
  2. 1번에서 못찾으면 2번의 경우의수로 다시 돌려보고, 2번에서도못찾으면 3번에서 찾게된다. 그리고 7번까지 가게됬을떄는 반드시 100% 확률로 찾게된다(비밀번호가 영문자,소문자,숫자로만 구성되어있다고가정)


3. CPU computing을 GPU computing으로 migration하는 방법


패스워드가 12345라고 가정해보자. 그럼 패스워드의 길이는 5개이다.

이때 생성하는 쓰레드 갯수를 10개로 잡는다.

블럭갯수는 10개로 잡는다. 

그렇다면 생성되는 쓰레드갯수는 100(10x10)개이다

그리고 쓰레드1개당 1000번의 iteration 갖는다.

따라서 연산량은 100000((10^5)번이다.


Device 함수에서는 이를 토대로 블럭인덱스와 쓰레드인덱스를 적절히 믹싱해 쓰레드마다 일정영역의 데이터만을 selection해와서 연산하게된다. 그래서 쓰레드는 서로 똑같은 양의 데이터를 가지고서 병렬로 연산하게된다.  또한 커널에서는 표준함수를 쓸수 없으므로 간단하게 직접 몇개(strcpy,strlen,strcmp) 구현.


단순히 비밀번호를 찾는로직1개와 비밀번호를찾는과정을 모두 파일입출력으로 쓰는 로직1개가 존재한다.

파일입출력은 커널에서 불가능하므로 커널에서 연산된 값을 global memory array 집어넣고 커널런치가 완료된 후에 device에서 host memory copy를하여 system call 이용해 파일입출력을 한다. 


4. 웹사이트분석


로그인할떄 로그인정보를 어디로보내는지(경로) 확인한다.

확인된 경로로 CUDA로 만든 password cluster file을 읽어서 폼데이터(form data)를 만들어서 무한정 POST요청을 보낸다.

Node.js에서 너무 큰 파일(password cluster file)을 열면 스택메모리가 깨지게된다 그래서 스택메모리를 늘릴수있어야한다. 예를 들어 다음명령어는 스택메모리를 4GB로 할당해서 실행한다


node --max-old-space-size=4096


5. Nsight monitor


CUDA 프로그램을 실행할때 반드시 Nsight monitor 프로그램에서 window tdr을 disable로 설정해야한다.

CUDA에서는 쓰레드가 timeout내에 커널이 종료되지않으면 강제로 종료시킨다. 따라서 무거운 프로그램을 돌릴경우 이 옵션을 끈상태에서 프로그램을 돌려야 강제종료되지않고 프로그램을 실행할수있다.



밑의 사진은 간단하게 패스워드를 찾는 프로그램실행화면이고, 실제 웹사이트 공격은 올리지않음.





6. 문제점


6-1. password cluster file을 만들기위한 연산은 병렬처리가맞는데 실제 쓰는작업은 직렬처리임(system call은 CPU에서만호출할수있으니까).

이것에 대한 해결방법이필요


6-2. POST요청을 보내는것을 Node.js에서 멀티쓰레딩으로 처리한다한들 CPU기반이기떄문에 너무약한속도임.  그렇다고 GPU환경(webgl, opencl)에서 실행할수가없음.


6-3. 공격받는 서버가 한 ip당 한 트랜잭션을 3초마다 처리하게끔하면 brute forcing 못함. 이말은 1분에 20개밖에 시도를못한다는소리인데 이러면 지구종말할떄까지 password못알아냄.




Language : C++(for making password cluster file) , Javascript(for web attack)

Technology : GPGPU programming, Node.js, Ajax







'Security' 카테고리의 다른 글

keylogger  (0) 2018.12.20
랜섬웨어  (0) 2018.12.20