해킹을 하기 전에 해킹하기
어떤 한 가지 언어만 공부할 필요는 없지만, 몇 가지 추천되는 언어는 존재한다.   C와 C++은 윈도우나 유닉스를 개발하는데 사용되었다. 이 언어들과 어셈블리 언어를 공부하면 해킹에 필요한 중요한 기술인 컴퓨터 메모리 구조를 배울 수 있다. 파이썬(Python)과 루비(Ruby)는 여러 가지 작업을 자동화하는데 사용되는 고수준의 강력한 스크립트 언어이다. 펄(Perl) 역시 배워 볼만 하며, 웹 관련 해킹을 다루고 싶다면 PHP는 필수이다. 수많은 웹사이트가 PHP로 작성되었기 때문이다. Bash 스크립트 언어 공부도 필수이다. Bash 스크립트 언어를 다룰 줄 알면, 유닉스/리눅스 시스템 스크립트를 작성할 수 있으며, 수많은 작업을 빠르고 편하게 진행할 수 있다. 어셈블리 언어도 필수이다. 이 언어는 컴퓨터의 CPU가 사용하는 언어이며, 수많은 종류가 존재한다. 어셈블리를 모르면 프로그램을 해킹해 정보를 빼 낼 수 없을 정도다. 해킹할 시스템에 대해 조사하는 과정을 enumeration이라고 부른다. 더 많은 것을 알고 있을수록, 예상하지 못했던 상황으로 인해 당황하는 경우가 줄어든다. Cygwin을 사용하면 윈도우 환경에서 유닉스/리눅스 터미널을 사용할 수 있다. Nmap의 경우에는 WinPCap을 설치하면 Cygwin이 없어도 사용할 수 있다. 하지만 Nmap은 윈도우에서는 잘 작동하지 않는데, 날소켓(raw socket, 생소켓)이 별로 없기 때문이다. 따라서 좀 더 유연한 시스템인 리눅스나 BSD를 사용해 보는 것도 좋다. 대개의 리눅스 배포판에는 유용한 도구들이 미리 깔려 있다.  다른 방법으로는, 2017년 적용된 윈도우 10 가을 크리에이터 업데이트(Windows 10 Fall Creators Update) 이후로는 마이크로소프트 스토어에서 bash를 설치해 사용할 수 있다. 이 글을 참조해 보자. 우선 자기 자신을 보호하는데 필요한 기술들부터 확실히 이해하고 있어야 한다. 기초부터 시작하자. 자기 컴퓨터의 네트워크를 공격해 보거나, 어떤 시스템을 공격해 봐도 되는지 관리자에게 물어 보거나, 가상 머신을 생성해 실험용 공간을 만들어 보자. 그냥 아무 시스템이나 막 공격하는 것은 불법 행위이며, 법적으로 곤란한 상황에 처할 수 있으니 주의하자. 원격 시스템에 도달 가능한지 확인해 보자. 대상이 네트워크에 연결되어 있는지 알아 보기 위해 (거의 모든 운영 체제에 기본적으로 설치되어 있는) ping 도구를 사용해 볼 수 있지만, 결과를 항상 신뢰할 수 있는 것은 아니다. ping은 ICMP 프로토콜에 기반한 시스템이라 깐깐한 시스템 관리자라면, 관련된 프로그램을 꺼 놨을 수도 있다. p0f나 nmap을 이용해 포트를 스캔해 본다. 그러면 시스템에서 어떤 포트가 열려 있는지, 방화벽이나 라우터는 어떤 것을 사용하는지 미리 확인하고 준비할 수 있다. nmap을 사용 중이라면 -O switch 명령을 이용해 운영체제를 확인해 볼 수 있다. FTP(21번), HTTP(80번) 같은 잘 알려진 포트들은 보호가 잘 되어 있으며, 정말 뚫기 어려운 보안 문제만 남아 있을 수 있다.   Telnet이나 온라인 게임을 위한 여러 가지 UDP 포트들 같은 것들은 열려 있지 않은지 확인해 본다. 22번 포트가 열려 있다는 것은 SSH(보안 셸)를 사용하고 있다는 의미인데, 가끔 값을 전부 다 대입해 보는 것(brute force)으로 보안 문제를 뚫어 버릴 수도 있다. 값을 다 넣어 보는 방식을 포함해 여러 가지 비밀 번호 해킹 방식이 있다. 값을 다 넣어 볼 때에는 프로그램에 포함된 자주 사용되는 비밀 번호들부터 전부 다 넣어 본다.   요즘에는 가입할 때 약한 비밀번호들을 확인하고 걸러 주기 때문에 값을 다 넣어 보는 방식은 시간이 오래 걸릴 수 있다. 하지만 이 방법 역시 발전해 가고 있다. 대다수의 해시 알고리즘은 약하기 때문에 이런 약점을 이용하면 해킹 과정이 짧아진다. (예를 들어, MD5을 1/4로 잘라낼 경우, 엄청난 속도 향상을 볼 수 있다.) 요즘 기술 중에는 그래픽 카드의 연산 기능을 활용하는 것도 있다. 수천 배는 빨라지게 된다. 비밀 번호를 뚫고 싶다면, Rainbow Tables를 사용해 보는 것도 좋다. 다만 기억해 두어야 할 것은 비밀 번호를 뚫는 것은 해시값을 가지고 있을 때에만 사용하는 것이 좋다는 것이다. 원격 서버에 모든 가능한 비밀 번호를 전송해 보는 것은 좋은 선택이 아니다. 많은 경우, 해킹 탐지 시스템에 의해 부정한 입력이라 판단되어 로그인이 금지된다. 그렇지 않더라도 해킹을 성공하는데 몇 년 이상 걸릴 수도 있다. 해킹된 태블릿이나 TCP 스캔, 와이파이 신호 업로드 등을 통해서 암호화되지 않은 아이디와 비밀번호를 받아낼 수도 있다. 많은 경우 비밀 번호를 해킹하지 않고 다른 방법으로 시스템에 침투하는 것이 훨씬 쉽다. 권한을 얻는다. 유닉스/리눅스 운영체제를 사용하고 있다면 루트(root) 권한을, 윈도우 시스템을 사용 중이라면 관리자 권한을 얻어 보자.   무척 중요한 정보는 대개 잘 보호되어 있으며, 그 정보를 얻기 위해서는 적절한 권한을 얻어야 한다. 모든 파일을 보고 싶다면, 수퍼 유저 권한이 필요하다. 수퍼 유저란 리눅스나 BSD 시스템에서 루트 사용자와 같은 권한을 가진 사용자를 의미한다. 라우터에서는 (변경되지 않았다면) "admin" 계정을 의미한다. 윈도우 시스템에서는 관리자(Administrator) 계정을 의미한다. 접속 가능하다는 것이 모든 내용을 읽어 볼 수 있으며, 변경, 실행 가능하다는 것을 의미하지 않는다. 수퍼 유저, 관리자 계정, 루트 계정만 가능한 일이다. 수퍼 유저 권한을 갖기 위해서 많이 사용하는 수법 중 하나는 버퍼 오버플로우(buffer overflow)이다. 메모리 내용을 덤프(dump)한 후, 원하는 코드를 삽입하거나 인가되지 않은 작업을 실행할 수 있기 때문이다.   유닉스 계열 시스템에서는 버그가 있는 프로그램에 setuid 비트가 설정되었다면, 프로그램이 수퍼 유저 같은 다른 사용자로 실행되는 경우가 있다. 해킹하려는 컴퓨터에 이런 안전하지 않은 프로그램을 설치하거나 그런 프로그램을 찾아 내었을 때에만 이 수법을 사용 가능하다. 어떤 컴퓨터에 대한 완전한 제어권을 얻게 되었다면, 나중에 쉽게 다시 돌아 올 수 있도록 준비를 해 두는 것이 좋다. 대개 SSH 서버 등을 이용해 다시 돌아 올 수 있는 백도어를 만들어 놓는다. 하지만 이런 백도어들은 대개 시스템 업그레이드 과정에서 삭제된다. 따라서 실력 있는 해커들은 컴파일러에 백도어를 설치해 컴파일러가 어떤 프로그램을 만들든 돌아 올 길을 만들어 놓는다. 시스템 운영자가 시스템이 해킹되었다는 것을 눈치 채지 못하게 해 보자. (웹사이트를 운영 중이라면) 웹사이트의 내용을 변경하거나, 필요한 것 이상으로 파일을 만들어 내거나, 사용자를 추가하지 말자. 최대한 빠르게 일을 처리하자. SSHD 같은 접속 프로그램을 해킹했다면, 여러분의 비밀번호를 하드 코딩으로 삽입해 두자. 그리고 누군가가 여러분이 아니라 다른 사람이 그 비밀 번호로 로그인하려고 한다면, 로그인은 성공하지만 해킹과 관련된 중요한 정보는 노출해서는 안 된다.
프로그래밍 언어를 공부한다. 공격할 시스템에 대해 조사한다. 유닉스/리눅스 터미널을 사용하자. 우선 자신이 사용하는 컴퓨터부터 안전하게 보호하자. 공격 대상을 시험해 보자. 운영 체제를 확인한다. 시스템에서 열려 있는 포트나 경로를 찾아 본다. 비밀번호나 인증 과정을 뚫어 보자. 수퍼 유저 몇 가지 수법을 실험해 보자. 백도어(backdoor)를 만들어 보자. 해킹되지 않은 것처럼 포장해 보자.
https://www.wikihow.com/Hack https://www.wikihow.com/Hack
Preparing Before You Hack Hacking