티스토리 뷰

반응형

 

5. 네트워크 취약점 진단 및 방화벽 설정 실무

5.1. 스니핑 탐지 및 네트워크 Flooding 공격 분석

(1) 네트워크 스니핑(Sniffing) 개념 및 5가지 핵심 탐지 메커니즘

- 요약 키워드: Promiscuous 모드, Ping(ICMP), ARP, DNS Reverse Lookup, Decoy, Arpwatch
- 이론 상세 내용 및 탐지 동작 방식:

스니핑 공격은 네트워크 카드가 자신에게 오지 않는 패킷까지 전부 수신하도록 제약 조건을 풀어버리는 Promiscuous(무차별) 모드를 활성화하여 수행합니다. 공격자는 수동적으로 패킷만 가로채기 때문에 탐지가 어렵지만, 다음과 같은 반응 유도 및 트래픽 모니터링 기법을 통해 식별할 수 있습니다.

  • Ping (ICMP Echo Request) 이용 방식: 스니핑이 의심스러운 호스트에 출발지 IP는 정상으로 두고 목적지 MAC 주소를 '존재하지 않는 가짜 MAC 주소'로 위조하여 전송합니다. 일반적인 호스트는 MAC 주소가 다르면 패킷을 랜카드 단에서 버리므로 응답하지 않지만, Promiscuous 모드가 켜진 스니퍼 호스트는 IP 헤더까지 확인하고 자신에게 온 핑으로 착각하여 ICMP Echo Reply를 반환하는 비정상적인 특징을 악용해 탐지합니다.
  • ARP 이용 방식: Ping 방식과 유사하게 비존재하는 가짜 목적지 MAC 주소로 위조된 ARP Request(질의) 패킷을 로컬 네트워크에 뿌립니다. 일반 호스트는 무시하지만, Promiscuous 모드의 스니퍼 호스트는 해당 ARP 요청에 대해 변조된 MAC 주소나 자신의 실제 MAC 주소로 ARP Reply 응답을 전송하므로 식별이 가능합니다.
  • DNS (Reverse Lookup) 이용 방식: 스니핑 툴은 가로챈 패킷의 IP 주소를 사람이 읽기 쉬운 도메인 네임으로 보여주기 위해 내부적으로 DNS Reverse Lookup(역방향 질의: IP에서 도메인 변환)을 자동 수행하는 경우가 많습니다. 네트워크의 모든 호스트에 ping 수행 후, 특정 호스트가 외부에 대량의 DNS 역방향 질의 요청(인터넷망으로 DNS 쿼리 송신)을 발생시키는지 감시하여 스니퍼를 탐지합니다.
  • Decoy (유인) 이용 방식: 네트워크 상에 가짜 계정 정보(ID/PW)와 기밀 데이터를 담은 가짜 패킷(가상의 미끼 트래픽)을 의도적으로 흘립니다. 공격자가 이 미끼 정보를 스니핑하여 실제 존재하지 않는 가짜 가상 시스템이나 서비스 시스템에 로그인을 시도하는 순간을 포착하여 공격 호스트를 역추적하고 탐지합니다.
  • Arpwatch 이용 방식: 로컬 네트워크 내에서 유통되는 모든 ARP 패킷을 실시간으로 모니터링하는 데몬 도구입니다. IP 주소와 MAC 주소의 매핑 관계 정보를 테이블에 상시 기록하고 있다가, 특정 호스트의 IP에 대한 MAC 주소가 갑자기 변경되거나 새로운 위조 MAC 주소가 등록되는 등 비정상적인 ARP 트래픽 변화(ARP Spoofing 징후 등)를 탐지합니다.

(2) TCP SYN Flooding 공격 원리 및 TCP SYN Cookie 메커니즘

- 요약 키워드: 3-Way Handshake, Backlog Queue 고갈, connlimit, First SYN Drop, SYN Cookie
- 이론 상세 내용 및 단계별 대응방안:

TCP SYN Flooding은 대량의 위조된 SYN 패킷을 서버에 퍼부어, 서버가 SYN+ACK를 보낸 후 대기하는 Half-Open 연결 상태(기본적으로 SYN_RECEIVED 상태)를 유발하고, 서버의 연결 대기 공간인 Backlog Queue를 완전히 고갈시켜 정상 사용자의 접속을 마비시키는 자원 고갈형 DoS 공격입니다.

  • 보안 장비 및 시스템 차원의 4대 대응방안:
    • Backlog Queue 크기 확대 및 커널 설정 변경: 완화 대책으로 시스템 커널에서 sysctl -w net.ipv4.tcp_max_syn_backlog를 통해 백로그 큐의 크기를 늘려주거나 세션 유지 타임아웃(Timeout)을 대폭 단축시켜 큐가 비워지는 속도를 높입니다. 
    • iptables의 임계치 설정 (connlimit 방어 예시): 방화벽 단에서 동일한 출발지 IP 대역으로부터 동시 접속할 수 있는 SYN 요청의 개수를 강제로 제한합니다.(pps) iptables -A INPUT -p tcp --syn -m connlimit --connlimit-above 10 -j DROP 형식의 규칙을 적용하여 임계치를 넘는 IP를 신속하게 차단합니다.
    • First SYN Drop (최초 SYN 폐기 기법): 인라인 보안 장비가 외부로부터 들어오는 최초의 SYN 패킷은 무조건 Drop(폐기)해 버리는 방어 기법입니다. 정상적인 TCP 스택을 가진 호스트라면 최초 패킷 유실 시 일정 시간 후 자동으로 SYN을 재전송(Retransmission)하지만, 단순 공격용 무작위 위조 스크립트는 재전송을 수행하지 않는 특성을 악용하여 위조 트래픽을 정제합니다.
    • TCP SYN Cookie 기능 사용:
      • 도입 목적: SYN Flooding 공격을 방어하기 위해 서버가 Backlog Queue에 아무런 자원(세션 정보)을 할당하지 않고도 정상적인 3-Way Handshake를 지속할 수 있도록 설계된 강력한 커널 방어 기능입니다.
      • 동작 원리 및 생성 알고리즘: 서버가 클라이언트로부터 SYN 패킷을 받으면, Backlog Queue 공간을 비워둔 채 출발지/목적지 IP, 포트 번호, 그리고 서버만의 비밀키(Secret Key) 등을 일방향 해시 함수로 연산하여 암호학적 식별값인 '쿠키(Cookie)'를 생성합니다. 이 쿠키값을 TCP 헤더의 초기 시퀀스 번호(Initial Sequence Number, ISN)로 삼아 클라이언트에 SYN+ACK를 전송합니다.
      • 최종 인증 및 연결 수립: 정상적인 클라이언트라면 서버가 보낸 시퀀스 번호에 1을 더한 값을 Acknowledgment Number(ACK 번호)로 담아 최종 ACK 패킷을 서버로 반환합니다. 서버는 이때 돌아온 ACK 번호 역산(재연산)을 통해 자기가 발행했던 쿠키 정보가 맞는지 수학적으로 검증하고, 일치할 때만 비로소 메모리에 연결 세션 공간을 생성(ESTABLISHED)하여 자원 낭비를 완벽히 방어합니다.

(3) 프로토콜 및 레이어별 Flooding 공격 기법 확장 분석

- 요약 키워드: UDP Flooding, ICMP Flooding, HTTP GET Flooding, Hulk DoS, Hash DoS
- 이론 상세 내용 및 계층별 대응방안:

네트워크 자원이나 서버의 대역폭을 임계치 이상으로 고갈시키는 범람(Flooding) 공격은 TCP뿐만 아니라 OSI 7계층의 다양한 프로토콜 특성을 악용하여 발생합니다. 기사 시험 실기 합격을 위해 각 프로토콜별 유발 패킷과 구체적인 대응방안 메커니즘을 숙지해야 합니다.

  • L3 및 L4(전송 계층) 기반 자원 고갈 공격:
    • UDP Flooding: 위조된 대량의 UDP 패킷을 대상 서버의 열려있지 않은 무작위 포트로 무차별 전송합니다. 패킷을 수신한 서버는 포트 활성화 여부를 확인한 뒤, 닫힌 포트일 경우 ICMP Destination Unreachable (Port Unreachable) 패킷을 생성하여 반환합니다. 이 과정에서 서버의 시스템 연산 자원과 아웃바운드 대역폭이 동시에 고갈됩니다.
      대응방안: 방화벽 및 IPS 보안 장비에서 UDP 유입 트래픽에 대한 임계치 제한(Rate Limiting) 규칙을 설정하여 초과 트래픽을 원천 Drop 처리하거나, 내부 시스템의 ICMP 응답 생성 속도를 강제로 제한합니다.
    • ICMP Flooding (Ping Flood): 대량의 ICMP Echo Request(핑 요청) 패킷을 타겟 서버에 직접 퍼붓는 대역폭 고갈형 공격입니다. 서버는 패킷을 받을 때마다 매번 ICMP Echo Reply(핑 응답) 패킷을 생성해 반환해야 하므로 회선이 마비됩니다.
      대응방안: 네트워크 경계 방화벽에서 ICMP 패킷의 인바운드 유입 자체를 차단하거나, IPS 장비에서 ICMP 트래픽 임계치 설정 규칙을 엄격하게 수립합니다.
  • L7(응용 계층) 기반 웹 서버 타겟 DoS 공격:
    • HTTP GET Flooding: 정상 웹 클라이언트로 위장하여 TCP 3-Way Handshake를 정상 완료한 후, 웹 서버의 자원 소모를 크게 유발하는 특정 페이지나 DB 연동 쿼리가 수반되는 URL을 대상으로 HTTP GET 요청을 무차별적으로 지속 전송하여 웹 서버 및 후단 DB 자원을 고갈시킵니다.
      대응방안: 웹 방화벽(WAF)을 도입하여 단일 클라이언트의 웹 요청 임계치를 통제하거나, 임계치 초과 시 임시적으로 차단 페이지 및 CAPTCHA(캡차) 인증 메커니즘을 유도하여 봇 트래픽을 정제합니다.

    • Hulk DoS: HTTP GET Flooding의 변종으로, 공격 요청 시 URL 주소창 맨 뒤에 의미 없는 파라미터 값(예: page.php?id=abc1, page.php?id=xyz2)을 매번 무작위로 변경하여 전송하는 공격입니다. 웹 서버나 웹 캐시 장비가 동일 요청에 대해 연산 부하를 줄이기 위해 지원하는 캐싱(Caching) 기능을 무력화시켜, 웹 서버가 매번 원본 페이지를 생으로 새로 연산하게 만듭니다.
      대응방안: 웹 방화벽 단에서 정규표현식 패턴 매칭을 통해 무작위 파라미터 유입 형식을 탐지하거나, 행동 기반 DDoS 방어 솔루션을 사용하여 단기간 내 비정상적 가변 페이지 요청 패턴을 차단합니다.
    • Hash DoS: 웹 서버가 클라이언트가 전송한 POST 파라미터 데이터를 관리하기 위해 내부적으로 사용하는 해시 테이블 구조의 허점을 노리는 정밀 공격입니다. 해시 함수 내부에서 서로 다른 데이터 입력값이 동일한 해시 버킷에 매핑되는 '해시 충돌(Hash Collision)'을 인위적으로 수만 건 발생시키는 조작된 파라미터(POST 파라미터)를 송신합니다. 웹 서버의 데이터 검색 알고리즘 시간 복잡도가 원래 효율적인 O(1)에서 최악의 구조인 O(N)으로 급증하여, 서버 CPU 자원이 충돌 정렬 작업에 완전히 고갈됩니다.
      대응방안: 웹 서버 소프트웨어(Apache, Tomcat 등)의 설정을 변경하여 하나의 HTTP Request 패킷이 가질 수 있는 최대 파라미터 개수(Max Parameter Count)를 제한하거나 최신 패치를 적용해 해시 알고리즘 임의 키(Salt) 기능을 활성화합니다.

 

5.2. TCP/IP 커널 파라미터 보안 설정

(4) 운영체제 및 프로토콜별 핵심 커널 파라미터 제어 가이드

- 요약 키워드: sysctl, /proc/sys, ndd, Smurf, SYN Flooding, ICMP Redirect, Source Routing, Forward
- 이론 상세 내용 및 운영체제별 설정 명령어:

리눅스 및 유닉스 계열 서버 시스템의 네트워크 프로토콜 스택 취약점을 보완하기 위한 핵심 커널 파라미터 제어 기법입니다. 리눅스는 sysctl/proc 파일시스템을 사용하며, 솔라리스 등 유닉스는 ndd 명령어를 활용합니다.

  • 1. Smurf(스머프) 공격 증폭기 방어 설정 (Directed Broadcast 차단):
    • Cisco 라우터 대책: 반드시 글로벌 설정 모드에서 해당 인터페이스 모드로 진입한 뒤 브로드캐스트 유입을 차단해야 합니다.
      Router# configure terminal 모드 진입 후 Router(config)# interface FastEthernet 0/0 모드 전환 후 Router(config-if)# no ip directed-broadcast 설정 적용
    • Linux 커널 설정: sysctl -w net.ipv4.icmp_echo_ignore_broadcasts=1 또는 echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
    • Unix (ndd) 설정: ndd -set /dev/ip ip_respond_to_echo_broadcast 0 (확인은 ndd -get /dev/ip ip_respond_to_echo_broadcast)
  • 2. TCP SYN Flooding 공격 대응 설정 (SYN Cookie 활성화):
    • Linux 커널 설정 (2가지 방식 필수 반영):
      방식 A (임시 적용): sysctl -w net.ipv4.tcp_syncookies=1
      방식 B (커널 직접 주입): echo 1 > /proc/sys/net/ipv4/tcp_syncookies
    • Unix (ndd) 설정: ndd -set /dev/tcp tcp_conn_req_max_q0 1024 (Half-Open 큐 크기 확장 대응)
  • 3. ICMP Redirect 공격 대응 설정 (라우팅 경로 변조 및 MITM 방어):
    • 설명: 공격자가 가짜 ICMP 리다이렉트 패킷을 보내 서버의 라우팅 테이블을 변조하는 스니핑/우회 공격을 방어하기 위해 관련 패킷 수신 기능을 비활성화합니다.
    • Linux 커널 설정: sysctl -w net.ipv4.conf.all.accept_redirects=0 또는 echo 0 > /proc/sys/net/ipv4/conf.all.accept_redirects
    • Unix (ndd) 설정: ndd -set /dev/ip ip_respond_to_redirect 0
  • 4. IP Source Routing 기능 비활성화 설정:
    • 설명: 송신자가 패킷의 이동 경로를 임의로 지정하는 소스 라우팅 옵션을 악용하여 공격자가 보안 장비(방화벽)를 우회하여 내부망에 침투하는 행위를 원천 차단합니다.
    • Linux 커널 설정: sysctl -w net.ipv4.conf.all.accept_source_route=0 또는 echo 0 > /proc/sys/net/ipv4/conf.all.accept_source_route
    • Unix (ndd) 설정: ndd -set /dev/ip ip_forward_src_routed 0
  • 5. IP Forward 기능 비활성화 설정:
    • 설명: 일반 서버 시스템이 자신을 거쳐가는 패킷을 라우터처럼 이웃 인터페이스로 중계(Forwarding)해 주는 기능을 꺼두어, 시스템이 악의적인 경유지(공격 징검다리)로 악용되는 것을 방지합니다.
    • Linux 커널 설정: sysctl -w net.ipv4.ip_forward=0 또는 echo 0 > /proc/sys/net/ipv4/ip_forward
    • Unix (ndd) 설정: ndd -set /dev/ip ip_forwarding 0

5.3. 네트워크 진단 및 방화벽 제어 실무 도구

(5) Nmap 스캐닝 도구 및 FTP Bounce Attack 메커니즘

- 요약 키워드: Network Mapper, 포트 스캔, OS 탐지(-O), 범위 지정(-p), 포트 포워딩 악용(-b)
- 이론 상세 내용 및 취약점 진단 실무:
  • Nmap (Network Mapper): 호스트의 활성화 여부, 열려 있는 포트 번호, 운영체제(OS) 정보, 실행 중인 서비스 버전을 정밀 진단하는 업계 표준 네트워크 취약점 스캐닝 도구입니다.
    • -O 옵션 (Operating System Detection): 대상 시스템의 TCP/IP 스택 반응 특성(핑 응답, TCP 윈도우 크기 등)을 분석하여 원격지 호스트의 운영체제 종류 및 커널 버전을 예측합니다.
    • -p 옵션 (Port Selection): 스캔할 포트의 범위를 강제로 수동 지정합니다. (예: -p 22,80,443 또는 전체 포트 대상인 -p 1-65535)
    • -b 옵션 (FTP Bounce Scan): 아래에서 설명할 FTP 프로토콜의 취약점을 이용한 스텔스 스캔을 수행할 때 타겟 정보를 지정하는 특수 옵션입니다.
      • FTP Bounce Attack (FTP 바운스 공격):
        • 기술 정의: FTP 프로토콜의 능동 모드(Active Mode) 데이터 전송 메커니즘을 규정한 PORT 명령을 악용하여, 공격자가 타겟 시스템을 직접 제어하지 않고 취약한 제3의 FTP 서버를 경유(임의의 IP 및 포트로 데이터 전송 요청)시켜 타겟의 포트 활성화 여부를 정밀 스캐닝하거나 방화벽을 우회하는 L7(어플리케이션 계층) 취약점 악용 공격입니다.
        • 세부 동작 메커니즘:
          • 공격자는 취약한 FTP 서버에 접속하여 제어 채널(기본 21번 포트)을 수립한 뒤, PORT [타겟 IP],[타겟 포트] 형태의 명령어를 FTP 서버에 주입합니다. 이때 입력하는 IP와 포트는 공격자 자신의 주소가 아닌 최종 공격 대상인 타겟 시스템의 주소입니다.
          • 이후 공격자가 LIST(목록 조회)나 RETR(파일 다운로드) 등의 데이터 전송 명령을 내리면, FTP 서버는 주입받은 PORT 명령의 목적지(타겟 시스템)로 3-Way Handshake를 시도하며 TCP 데이터 연결(기본 20번 포트)을 감행합니다.
          • 공격자는 최종적으로 FTP 서버가 제어 채널로 반환하는 응답 코드(예: 연결 성공 시 150 / 연결 실패 시 425 등)를 분석하여, 최종 타겟 시스템의 해당 포트가 열려 있는지(Open) 닫혀 있는지(Closed) 여부를 판별하는 스텔스 포트 스캔을 수행합니다.

(6) tcpdump 패킷 스니핑 및 감사 추적 실무

- 요약 키워드: 커맨드라인 패킷 분석, 인터페이스 지정(-i), 파일 저장(-w), ASCII 출력(-X)
- 이론 상세 내용 및 핵심 옵션 가이드:

tcpdump는 명령줄(CLI) 환경에서 작동하는 가장 강력한 리눅스/유닉스용 네트워크 패킷 캡처 및 분석 도구입니다. 침해사고가 발생했을 때 실시간으로 네트워크 유입 트래픽을 모니터링하거나 감사 로그 파일로 추출할 때 필수적으로 활용됩니다.

  • 실무 다빈도 기본 활용 옵션:
    • -i [인터페이스명]: 특정 무선/유선 랜카드 장치를 지정하여 패킷을 수집합니다. (예: tcpdump -i eth0)
    • -w [파일명.pcap]: 화면에 패킷을 뿌리지 않고, Wireshark 등에서 정밀 분석이 가능하도록 Raw 패킷 데이터를 파일 형태로 직접 저장합니다.
    • -r [파일명.pcap]: 저장해 둔 패킷 파일(.pcap)의 내용을 읽어와 화면에 출력합니다.
    • -c [개수]: 지정한 개수만큼의 패킷만 수집한 후 프로그램을 자동으로 종료합니다. (예: tcpdump -c 100)
    • -X: 패킷의 헤더와 페이로드(데이터 내용)를 16진수(Hex)와 함께 ASCII(텍스트) 값으로 동시에 파싱하여 화면에 출력해 주므로 평문 데이터 수집 시 매우 직관적입니다.
    • -nn: 프로토콜 이름(예: http, ssh)이나 호스트 도메인 이름 변환을 생략하고 숫자 형태의 포트 번호와 IP 주소로 강제 고정하여 출력 속도를 대폭 향상시킵니다. -n일 때는 IP만, -nn일 때는 포트번호까지.
  • 종합 명령어 실무 예시: tcpdump -i eth0 -nn -X src host 192.168.10.5 and port 80
    - eth0 인터페이스를 통해 유입되는 패킷 중 출발지 IP가 192.168.10.5이고 서비스 포트가 80번(HTTP)인 트래픽의 본문 텍스트 내용을 16진수 및 ASCII 형식으로 빠르게 실시간 스니핑합니다.

(7) Linux iptables 방화벽 아키텍처 및 설정 문법

- 요약 키워드: 넷필터(Netfilter) 커널 모듈, Filter / NAT / Mangle, 체인 흐름 메커니즘
- 이론 상세 내용 및 방화벽 문법 규칙:

iptables는 리눅스 커널 방화벽이 제공하는 테이블들과 그것을 저장하는 체인, 규칙들을 구성할 수 있게 해주는 도구로, 규칙(룰) 기반의 다양한 패킷 필터링 기능을 제공합니다. (네트워크 서비스에 관련한 트래픽을 제어하고 모니터링할 수 있는 UNIX 기반의 방화벽인 TCP Wrapper와 혼동 가능성이 있습니다.)

  • 1. 패킷 이동 경로에 따른 5가지 체인(Chain):
    • PREROUTING: 패킷이 네트워크 카드를 통해 방화벽 외부 입구에 도착하자마자 라우팅 경로를 결정하기 전에 거치는 체인 (DNAT 설정에 주로 활용)
    • INPUT: 목적지가 외부가 아닌 '방화벽 서버 자체(로컬 시스템)'로 향하는 패킷이 통과하는 필터링 영역
    • FORWARD: 방화벽 서버가 목적지가 아니며, 다른 네트워크 인터페이스나 이웃 시스템으로 그냥 거쳐 지나가는(라우팅 중계) 패킷이 통과하는 영역
    • OUTPUT: 방화벽 서버 자체 시스템 내부에서 최초 생성되어 외부로 나가는 패킷을 통제하는 영역
    • POSTROUTING: 모든 라우팅 및 필터링 결정을 끝내고 방화벽 장비를 떠나 외부 네트워크 회선으로 완전히 나가기 직전에 거치는 체인 (SNAT 설정에 주로 활용)
  • 2. 주요 명령어 옵션 및 실무 설정 예시 규칙:
    • -A [체인명] (Append): 지정한 체인의 규칙 리스트 맨 끝에 새로운 규칙을 추가합니다.
    • -p [프로토콜]: 대상 프로토콜(tcp, udp, icmp 등)을 지정합니다.
    • -s [IP대역] / -d [IP대역]: 출발지 주소(source)와 목적지 주소(destination)를 지정합니다.
    • --sport [포트] / --dport [포트]: 출발지/목적지 포트 번호를 매칭합니다.
    • -j [타겟] (Jump): 패킷 매칭 시 내릴 조치 액션을 뜻합니다. (ACCEPT, DROP, REJECT, SNAT, DNAT 등)
    • 실무 응용 퀴즈 대비 예시: iptables -A INPUT -p tcp -s 192.168.1.100 --dport 22 -j DROP
      - filter 테이블의 INPUT 체인에 규칙을 추가: 출발지 IP가 192.168.1.100인 곳에서 방화벽 내부의 22번 포트(SSH)로 접속을 시도하는 TCP 패킷은 응답 없이 즉시 드롭(폐기)하여 접근을 제어합니다.

(8) (참고 수준) CIDR(Classless Inter-Domain Routing) IP 주소 할당 방식

- 요약 키워드: 클래스리스, 서브넷 마스크 비트 표기, IP 자원 낭비 방지
- 개념 및 핵심 매커니즘:
  • 도입 배경: 과거의 고정형 클래스(Class A, B, C) 기반 IP 할당 방식은 네트워크 크기에 맞춰 정해진 덩어리 형태로만 IP를 쪼개주었기 때문에, 미사용 주소가 과도하게 버려지는 치명적인 IP 자원 낭비 문제가 존재했습니다. 이를 해결하기 위해 클래스 구분을 과감히 없앤 클래스리스(Classless) 구조인 CIDR가 전 세계 표준으로 도입되었습니다.
  • 핵심 원리 (슬래시 비트 표기법): 서브넷 마스크의 네트워크 ID 범위 길이를 IP 주소 뒤에 슬래시(/) 부호와 숫자로 직관적으로 표현하는 방식입니다. 예를 들어, 클래스 C의 기본 마스크 구조인 255.255.255.0 대신 192.168.10.0/24와 같이 간결하게 네트워크 식별 범위를 선언합니다.
반응형
댓글
반응형
Recent Post.
Recent Reply.
Thanks for comming.
오늘은
명이 방문했어요
어제는
명이 방문했어요