Linux 퀘스트. 수상자 여러분 축하드립니다! 그들의 해결책을 알아보세요.

Linux 퀘스트. 수상자 여러분 축하드립니다! 그들의 해결책을 알아보세요.

25월 XNUMX일 등록을 시작했습니다. Linux 탐구, это Игра для любителей и знатоков операционной системы Linux. Немного статистики: зарегистрировалось на игру 1117 человек, из них 317 — нашли хотя бы один ключ, 241 успешно справились с заданием первого этапа, 123 — второго и 70 прошли третий этап. Сегодня наша игра подошла к концу, и мы поздравляем наших победителей!

  • Alexander Teldekov가 XNUMX위를 차지했습니다.
    Alexander는 자신이 가장 전형적인 시스템 관리자라고 스스로에게 말했습니다. 볼고그라드에 거주하며 약 XNUMX년 동안 다양한 Unix 계열 시스템을 관리해 왔습니다. 저는 인터넷 제공업체, 은행, 시스템 통합업체에서 일했습니다. 이제 그는 소규모 회사에서 원격으로 근무하며 대규모 외국 고객을 위한 클라우드 인프라 작업을 하고 있습니다. 읽기와 음악 듣기를 좋아합니다. 게임에 대해 Alexander는 게임 전체를 좋아하고 그러한 작업을 좋아한다고 말했습니다. 한 회사에서 인터뷰하는 동안 Hackerrank와 비슷한 일을 했는데 흥미로웠습니다.
  • 두 번째 장소 - Roman Suslov.
    Роман из Москвы. Ему 37 лет. Работает Linux/Unix-инженером в компании «Инфосистемы Джет». По работе приходится заниматься администрированием и траблшутингом Linux/Unix-систем + SAN. Интересы самые разные: Linux-системы, программирование, reverse engineering, информационная безопасность, Arduino. Про Игру Роман отметил, что игра в целом понравилась. «Размял немного свои извилины и отвлекся от серых будней повседневной работы. 🙂 Хотелось бы побольше заданий, а то не успел войти во вкус как игра уже закончилась».
  • 세 번째 - alex3d.
    Alex는 모스크바에 거주하며 소프트웨어 개발 분야에서 일하고 있습니다. "콘테스트에 참여해 주셔서 감사합니다. 내 google-fu 기술을 테스트할 수 있어서 흥미로웠습니다."

또한 상위 10명의 선수 순위에서는 다음과 같습니다.

  • 예브게니 살다예프
  • 마르켈 모크나체프스키
  • 콘스탄틴 코노소프
  • 파벨 세르게예프
  • 블라디미르 보바예프
  • 이반 부브노프
  • 파블로 클레츠

우리는 모든 문제를 해결하기 위한 다양한 옵션이 있다는 것을 알고 있으며, 가능한 해결 방법 중 일부가 아래에 설명되어 있습니다.

1. 첫 번째 단계

따뜻한 램프 서비스를 수정하는 작업이 매우 간단했기 때문에 "정말 관리자이신가요?"라고 불렀습니다.

1.1. 재미있는 사실 :

두 명의 플레이어가 게임 시작 후 15분 동안 첫 번째 열쇠를 찾았고, 첫 번째 시간에는 임무를 완료한 리더가 세 명 있었습니다.

1.2. 운동

당신은 오랫동안 유능한 정보 기술 전문가가 없었던 회사에서 일했습니다. 정리를 시작하기 전에 사무실 업무를 방해하는 불타는 문제를 해결해야 합니다.

청소 아주머니가 서버 캐비닛의 전원 케이블을 걸레로 잡아당겼습니다. 전원이 복구되었지만 매우 중요한 웹사이트가 여전히 작동하지 않습니다. 회사에서는 정보 보안에 별로 관심이 없기 때문에 웹사이트가 중요한데, 이 메인 페이지에서는 CEO 컴퓨터의 관리자 비밀번호를 일반 텍스트로 확인할 수 있습니다.

얼마전 비밀번호가 변경됐는데 모두가 새 비밀번호를 잊어버려서 감독이 일을 할 수가 없어요. 이 기계에는 회계 문서의 백업 사본을 해독하는 데 도움이 될 수 있는 키가 더 있다는 소문이 있습니다.

모두가 문제의 신속한 해결을 기대합니다!

1.3. 솔루션

1. Первым делом нужно поменять пароль root на виртуальной машине, чтобы получить на нее доступ. При запуске замечаем, что это Ubuntu 16.04 서버.

Для сброса пароля рута рестартуем машину, при загрузке, в момент отображения меню grub-а, переходим в редактирование пункта Ubuntu кнопкой «e». Редактируем строчку linux, добавляем в конец init=/bin/bash. Ctrl+x를 통해 로드하면 bash가 발생합니다. rw로 루트를 다시 마운트하고 비밀번호를 변경하십시오.

$ mount -o remount,rw /dev/mapper/ubuntu--vg-root
$ passwd

동기화를 잊지 말고 재부팅하세요.

2. 웹 서버가 작동하지 않는다는 조건이 표시됩니다. 다음을 확인하세요.

$ curl localhost
Not Found
The requested URL / was not found on this server.
Apache/2.4.18 

즉, 실제로 Apache가 실행 중이지만 코드 404로 응답합니다. 구성을 살펴보겠습니다.

$ vim /etc/apache2/sites-enabled/000-default.conf

여기에도 열쇠가 있습니다 - StevenPaulSteveJobs.

경로 확인 중 /usr/share/WordPress - 그런 건 없지만 있어요. /usr/share/wordpress. 구성을 편집하고 Apache를 다시 시작하십시오.

$ systemctl restart apache2

3. 다시 시도하면 오류가 발생합니다.

Warning: mysqli_real_connect(): (HY000/2002): Connection refused in /usr/share/wordpress/wp-includes/wp-db.php on line 1488

데이터베이스가 실행되고 있지 않습니까?

$ systemctl status mysql
Active: active (running)

무슨 일이야? 우리는 그것을 알아내야 합니다. 이렇게 하려면 다음에 설명된 대로 MySQL에 대한 액세스 권한을 얻어야 합니다. 선적 서류 비치. 문서 포인트 중 하나에서는 옵션을 등록할 것을 권장합니다. skip-grant-tables в /etc/mysql/mysql.conf.d/mysqld.cnf. 여기에는 AugustaAdaKingByron이라는 열쇠도 있습니다.

사용자 권한 수정 'wp'@'localhost'. MySQL을 시작하고 네트워크를 통해 액세스할 수 있도록 하며 구성 옵션에 주석을 달았습니다. skip-networking.

4. 이 단계를 수행하면 웹 서버가 시작되지만 사이트가 여전히 작동하지 않습니다.

Warning: require_once(/usr/share/wordpress/wp-content/themes/twentysixteen/footer.php): failed to open stream: Permission denied in /usr/share/wordpress/wp-includes/template.php on line 562

파일에 대한 권리를 편집합니다.

$ chmod 644 /usr/share/wordpress/wp-content/themes/twentysixteen/footer.php

페이지를 새로 고치고 사이트로 이동하여 BjarneStroustrup이라는 키를 찾으세요! 우리는 세 개의 키를 모두 찾았고, 우리 이사가 일할 수 있었고, 회계 파일을 해독했습니다. 모두가 만족하며 회사에서 인프라, 백업 및 보안을 설정하려면 앞으로 해야 할 일이 많습니다.

2. 두 번째 단계

분석자료 수집 문제를 해결하는 것이 필요했습니다. 누구나 분석을 좋아합니다. 누가, 어디서, 얼마나 많이 사용하는지 말이죠. 우리는 모든 엔지니어가 인생에서 어떤 형태로든 접할 수 있는 사례를 생각해냈습니다.

2.1. 흥미로운 사실

우리 플레이어 중 한 명이 게임 시작 후 10분 이내에 올바른 키를 입력했고, 첫 XNUMX시간 이내에 작업을 완료한 리더가 있었습니다.

2.2. 운동

당신은 회사에 출근했고 관리자들이 당신에게 와서 아프리카에서 누구에게 편지를 보냈는지 찾아달라고 요청했습니다. 이를 기반으로 상위 21개의 수신자 주소를 구축해야 합니다. 받는 사람 주소의 첫 글자가 열쇠입니다. 한 가지: 편지가 전송된 메일 서버가 로드되지 않습니다. 모두가 문제의 신속한 해결을 기대합니다!

2.3. 솔루션

1. fstab에 존재하지 않는 스왑 파티션으로 인해 서버가 부팅되지 않습니다. 로드할 때 시스템이 서버를 마운트하려고 시도하고 충돌합니다. 부팅하는 방법?

Скачиваем образ, мы скачали CentOS 7, грузимся с Live CD/DVD (Troubleshooting -> Rescue), монтируем систему, правим /etc/fstab. 우리는 즉시 첫 번째 키인 GottfriedWilhelm11646Leibniz를 찾습니다!

스왑 생성:

$ lvcreate -n swap centos -L 256M
$ sync && reboot

2. 언제나 그렇듯이 비밀번호는 없습니다. 가상 머신의 루트 비밀번호를 변경해야 합니다. 우리는 첫 번째 작업에서 이미 이 작업을 수행했습니다. 서버를 변경하고 성공적으로 로그인했지만 즉시 재부팅됩니다. 모든 로그를 주의 깊게 볼 시간조차 없을 정도로 서버가 과부하 상태입니다. 무슨 일이 일어나고 있는지 이해하는 방법은 무엇입니까?

다시 livecd에서 부팅하고, 시스템 로그를 주의 깊게 연구하고, 만일의 경우에 대비하여 cron을 조사합니다. 거기서 우리는 문제와 두 번째 열쇠인 Alan1912MathisonTuring을 발견했습니다!

필요 /etc/crontab 줄 삭제 또는 주석 처리 echo b > /proc/sysrq-trigger.

3. 서버가 로드되면 관리자의 작업인 "아프리카의 주소는 무엇입니까?"를 완료할 수 있습니다. 이 정보는 일반적으로 대중에게 공개됩니다. 이 정보는 "ip 주소 아프리카", "geoip 데이터베이스"라는 문구를 사용하여 인터넷에서 찾을 수 있습니다. 문제를 해결하기 위해 무료로 사용 가능한 주소 분산 데이터베이스(geoip)를 사용할 수 있습니다. 우리는 데이터베이스를 표준으로 사용했습니다. 맥스마인드 지오라이트2, Creative Commons Attribution-ShareAlike 4.0 라이센스에 따라 사용 가능합니다.

Попробуем решить нашу задачу, используя только системные утилиты Linux, но вообще ее можно решать огромным количеством способов: с помощью утилит фильтрации текста и с помощью скриптов на различных языках программирования.

우선, 메일 로그에서 "발신자-수신자 IP" 쌍을 간단히 가져옵니다. /var/log/maillog (이메일 수신자 테이블을 작성해 보겠습니다 - 발신자 IP). 이 작업은 다음 명령을 사용하여 수행할 수 있습니다.

$ cat /var/log/maillog | fgrep -e ' connect from' -e 'status=sent' | sed 's/[]<>[]/ /g' | awk '/connect from/ {ip=$11} /status=sent/ {print $10" "ip}' > log1.txt

그리고 아프리카 주소 데이터베이스를 계속 컴파일하기 전에 보낸 사람의 상위 IP 주소를 살펴보겠습니다.

$ cat log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n 40
5206 L2JhbjAbM67GA99jg@mail.ru
4165 iHKTBkegOQa6fIALq@mail.ru
3739 nHkcBl7BdgXxijSYD7@mail.ru
3405 SMAzPJAzbl9vp4hAXo@mail.ru
3346 xILz6d7P@mail.ru

그중에서도 위에서부터 처음 세 명의 수신자가 편지 수 면에서 단연 눈에 띈다. 이 상위 3개 주소로 보낸 보낸 사람의 IP 주소를 조사하면 특정 네트워크가 확실히 우세하다는 것을 알 수 있습니다.

$ cat log1.txt | fgrep 'L2JhbjAbM67GA99jg@mail.ru' | cut -d' ' -f2 | sort | cut -d'.' -f1 | uniq -c | sort -r | head
831 105
806 41
782 197
664 196
542 154
503 102
266 156
165 45
150 160
108 165

대부분의 네트워크 105/8, 41/8, 196/8,197/8은 인터넷 리소스를 배포하는 41개 지역 인터넷 등록 기관 중 하나인 AFRINIC에 할당됩니다. AFRINIC은 아프리카 전역에 주소 공간을 배포합니다. 그리고 8/XNUMX은 완전히 AFRINIC을 나타냅니다.

https://www.nic.ru/whois/?searchWord=105.0.0.0 
https://www.nic.ru/whois/?searchWord=41.0.0.0

따라서 문제에 대한 답은 실제로 로그 자체에 있습니다.

$ cat log1.txt | fgrep -e '105.' -e '41.' -e '196.' -e '197.' -e '154.' -e '102.' | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
4209 L2JhbjAbM67GA99jg@mail.ru
3313 iHKTBkegOQa6fIALq@mail.ru
2704 nHkcBl7BdgXxijSYD7@mail.ru
2215 uvRbp1O@mail.ru
1774 sPmMsmmFiV@mail.ru
1448 BtG3aHgQgCKuze2AKuRH@mail.ru
1233 eQpuuQ2uQdbwRL3@mail.ru
958 nJT5dpaBZ@mail.ru
862 ef4WbQiB@mail.ru
762 dQCqKL6eVminFfH7wLA@mail.ru
632 ifq6Rd1HxuCQOdO9@mail.ru
539 cFwm2ssypMmx1sA7@mail.ru
531 twtTnr4G@mail.ru
431 TSrczgYASrR11Hs3qCi@mail.ru
380 o3r3exc3OL@mail.ru
357 rzmjr2VAHK@mail.ru
348 vnPr6YjJ3ndw@mail.ru
312 anOjFXrwOtLP2Rl1Vcz6@mail.ru
289 dvny5zHmRW8fiT@mail.ru
282 sgg9jPxFDYvzw8Kr@mail.ru
274 tKSevzA7GntJ@mail.ru

На данном этапе мы получаем строку «LinuxBenedictTorvadst».

올바른 키: "LinusBenedictTorvalds".

결과 문자열에는 마지막 3자의 올바른 키와 관련된 오타가 포함되어 있습니다. 이는 우리가 선택한 네트워크가 전적으로 아프리카 국가 전용이 아니며 이메일이 로그의 IP 주소에 따라 배포되는 방식 때문입니다.

아프리카 국가에 할당된 최대 네트워크에 대한 충분한 사양을 통해 정확한 답을 얻을 수 있습니다.

$ cat log1.txt | fgrep -e' '105.{30..255}. -e' '41. -e' '196.{64..47}. -e' '196.{248..132}. -e' '197.{160..31}. -e' '154.{127..255}. -e' '102.{70..255}. -e' '156.{155..255}. | awk '{print $1}' | sort | uniq -c | sort -r | head -n 21
3350 L2JhbjAbM67GA99jg@mail.ru
2662 iHKTBkegOQa6fIALq@mail.ru
2105 nHkcBl7BdgXxijSYD7@mail.ru
1724 uvRbp1O@mail.ru
1376 sPmMsmmFiV@mail.ru
1092 BtG3aHgQgCKuze2AKuRH@mail.ru
849 eQpuuQ2uQdbwRL3@mail.ru
712 nJT5dpaBZ@mail.ru
584 ef4WbQiB@mail.ru
463 dQCqKL6eVminFfH7wLA@mail.ru
365 ifq6Rd1HxuCQOdO9@mail.ru
269 cFwm2ssypMmx1sA7@mail.ru
225 twtTnr4G@mail.ru
168 TSrczgYASrR11Hs3qCi@mail.ru
142 o3r3exc3OL@mail.ru
111 rzmjr2VAHK@mail.ru
 96 vnPr6YjJ3ndw@mail.ru
 78 anOjFXrwOtLP2Rl1Vcz6@mail.ru
 56 lHzWiB7ExvRtSbAcU9@mail.ru
 56 dvny5zHmRW8fiT@mail.ru
 40 sgg9jPxFDYvzw8Kr@mail.ru

문제는 다른 방법으로도 해결될 수 있습니다.
MaxMind를 다운로드하고 압축을 풀면 다음 세 가지 명령도 문제를 해결합니다.

$ cat GeoLite2-Country-Locations-ru.csv | grep "Африка" | cut -d',' -f1 > africaIds.txt
$ grep -Ff africaIds.txt GeoLite2-Country-Blocks-IPv4.csv | cut -d',' -f1 > africaNetworks.txt
$ grepcidr -f africaNetworks.txt log1.txt | cut -d' ' -f1 | sort | uniq -c | sort -r | head -n21

어떤 식으로든 우리는 결국 통계를 계산했고 관리자들은 업무에 필요한 데이터를 받았습니다!

3. 세 번째 단계

세 번째 단계는 첫 번째 단계와 다소 유사합니다. 따뜻한 램프 서비스도 수정해야 하지만 모든 것이 첫 번째 작업보다 더 복잡합니다.

3.1. 흥미로운 사실

처음 15분 동안 2명의 플레이어가 첫 번째 열쇠를 찾았고, 스테이지 시작 후 20시간 XNUMX분 후에 우리의 승자가 열쇠를 완성했습니다.

3.2. 운동

당신은 모든 회사 문서가 내부 Wiki 서버에 저장되어 있는 회사에 근무했습니다. 작년에 한 엔지니어는 시스템의 내결함성을 위해서는 디스크를 일종의 어레이에 배치해야 한다고 주장하면서 기존 디스크 3개 외에 서버용 새 디스크 XNUMX개를 주문했습니다. 불행히도 설치 후 몇 주 후에 엔지니어는 인도로 휴가를 갔다가 돌아오지 않았습니다.

서버는 몇 년 동안 문제없이 작동했지만 며칠 전에 회사 네트워크가 해킹당했습니다. 안내에 따라 보안직원이 서버에서 디스크를 꺼내어 보내드렸습니다. 운송 중에 디스크 하나가 복구 불가능하게 손실되었습니다.

Wiki의 기능을 복원해야 하며, 우선 Wiki 페이지의 콘텐츠에 관심이 있습니다. 이 위키 페이지 중 하나에 있던 특정 텍스트는 1C 서버의 비밀번호이며 잠금을 해제하는 데 긴급하게 필요합니다.

또한 위키 페이지나 다른 곳에는 로그 서버와 영상 감시 서버의 비밀번호가 있었는데, 이 비밀번호도 복구하는 것이 바람직하며, 비밀번호가 없으면 사건 조사가 불가능합니다. 언제나 그랬듯, 문제가 신속하게 해결되기를 기대합니다!

3.3. 솔루션

1. 우리가 가지고 있는 디스크에서 하나씩 부팅을 시도하면 어디에서나 동일한 메시지가 나타납니다.

No bootable medium found! System halted 

Надо с чего-то загрузиться. Опять спасает загрузка с Live CD/DVD (Troubleshooting -> Rescue). При загрузке пытаемся найти загрузочный раздел, не находим, попадаем в shell. Пытаемся изучать что и как с дисками. Известно, что их три. Инструментов для этого больше в 7-й версии CentOS, где есть команды blkid 또는 lsblk, 디스크에 대한 모든 정보를 보여줍니다.

우리가 하는 일과 방법:

$ ls /dev/sd*

그것은 즉시 분명하다

/dev/sdb1 - ext4
/dev/sdb2 - часть lvm
/dev/sda1 и /dev/sdc1 - части рейда
/dev/sda2 и /dev/sdc2 - про них ничего не известно на текущий момент

Монтируем sdb1, видно, что это загрузочный раздел CentOS 6.

$ mkdir /mnt/sdb1 && mount /dev/sdb1 /mnt/sdb1

분명히 우리는 grub 섹션으로 이동하여 그곳에서 첫 번째 키인 James191955Gosling을 특이한 파일에서 찾습니다.

2. 우리는 LVM을 사용하므로 pvs와 lvs를 연구합니다. 우리는 2개의 물리적 볼륨이 있어야 한다는 것을 알 수 있습니다. 하나는 찾을 수 없으며 손실된 UID에 대해 불평합니다. 루트와 스왑이라는 2개의 논리 볼륨이 있어야 하며 루트는 부분적으로 손실되었습니다(볼륨의 P 속성). 장착이 불가능해서 아쉽네요! 우리는 그가 정말 필요해요.

디스크가 2개 더 있습니다. 이를 살펴보고 조립하고 마운트합니다.

$ mdadm --examine --verbose --scan
$ mdadm --assemble --verbose --scan
$ mkdir /mnt/md127 && mount /dev/md127  /mnt/md127 

Смотрим, видно, что это загрузочный раздел CentOS 6 и дубль того, что уже есть на /dev/sdb1, 그리고 여기에도 동일한 키가 있습니다 - DennisBMacAlistairCRitchie!
어떻게 조립되었는지 볼까요? /dev/md127.

$ mdadm --detail /dev/md127

4개의 디스크로 조립했어야 했지만 XNUMX개의 디스크로 조립되었어야 했습니다. /dev/sda1 и /dev/sdc1, 시스템에서 2번과 4번이어야 합니다. 우리는 다음과 같이 가정합니다. /dev/sda2 и /dev/sdc2 배열을 수집할 수도 있습니다. 메타데이터가 없는 이유는 확실하지 않지만 이는 고아 어딘가에 있는 관리자의 양심에 달려 있습니다. 옵션이 있지만 RAID10이 있어야 한다고 가정합니다. 우리는 다음을 수집합니다:

$ mdadm --create --verbose /dev/md0 --assume-clean --level=10 --raid-devices=4 missing /dev/sda2 missing /dev/sdc2

blkid, pvs, lvs를 살펴봅니다. 우리는 이전에 부족했던 물리적 볼륨을 수집했음을 발견했습니다.

lvroot가 즉시 복구되어 마운트되지만 먼저 VG를 활성화합니다.

$ vgchange -a y
$ mkdir /mnt/lvroot && mount /dev/mapper/vg_c6m1-lv_root /mnt/lvroot 

그리고 루트 홈 디렉터리(/root/sweet)의 키를 포함하여 모든 것이 있습니다.

3. 서버가 정상적으로 시작될 수 있도록 계속해서 서버를 부활시키려고 노력 중입니다. 우리의 모든 논리 볼륨 /dev/md0 (우리가 모든 것을 찾은 곳) 다음으로 드래그하세요. /dev/sdb2, 전체 서버가 처음에 작동했던 곳입니다.

$ pvmove /dev/md0 /dev/sdb2
$ vgreduce vg_c6m1 /dev/md0

서버를 끄고 디스크 1과 3을 제거하고 두 번째 디스크는 그대로 두고 Live CD/DVD에서 Rescue로 부팅합니다. 부팅 파티션을 찾고 grub에서 부트로더를 복원합니다.

root (hd0,0)
setup (hd0)

부팅 디스크를 떼어내고 성공적으로 로드했지만 사이트가 작동하지 않습니다.

4. 웹 사이트를 시작하는 데는 두 가지 옵션이 있습니다. Apache를 처음부터 구성하거나 미리 구성된 php-fpm과 함께 nginx를 사용하는 것입니다.

$ /etc/init.d/nginx start
$ /etc/init.d/php-fpm start

마지막으로 MySQL을 시작해야 합니다.

$ /etc/init.d/mysqld start

시작되지 않으며 답은 다음과 같습니다. /var/log/mysql. MySQL 문제를 해결하자마자 사이트가 작동하고 메인 페이지에 RichardGCCMatthewGNUStallman이라는 키가 표시됩니다! 이제 우리는 1C에 액세스할 수 있게 되었고 직원들은 급여를 받을 수 있게 되었습니다. 그리고 언제나 그렇듯이 회사에 인프라와 보안을 구축하려면 앞으로 해야 할 일이 많이 있습니다.

또한 우리와 참가자들이 게임을 준비하는 데 도움이 된 책 목록을 다시 한 번 공유할 수 있습니다. linux.mail.ru/books.

우리와 함께해주셔서 감사합니다! 다음 게임에 대한 공지를 계속 지켜봐주세요!

출처 : habr.com

DDoS 보호, VPS VDS 서버가 있는 사이트를 위한 안정적인 호스팅 구입 🔥 DDoS 공격 방지 기능이 탑재된 안정적인 웹사이트 호스팅, VPS 및 VDS 서버를 구매하세요 | ProHoster