고양이의 도움으로 파일 권한 변경하기

고양이의 도움으로 파일 권한 변경하기
root@system:~# less myfile
-bash: /bin/less: Input/output error

루트 파일 시스템이 종료되었습니다. 하지만 내 고양이는 아직 살아있습니다(내 기억 속에):

root@system:~# cat > /tmp/somefile
C^d
root@system:~#

하지만 그는 조금 외로워요. 그의 친구들도 모두 떠났거든요.

root@system:~# mount
-bash: /bin/mount: Input/output error
root@system:~# dmesg
-bash: /bin/dmesg: Input/output error
root@system:~# less
-bash: /bin/less: Input/output error
root@system:~# chmod
-bash: /bin/chmod: Input/output error

시스템은 여전히 ​​기능하고 있으며 그 목적을 달성하고 있습니다. 이에 대한 유일한 합리적인 대응은 시스템을 종료하고 루트 드라이브를 교체하는 것입니다. 안타깝게도 이는 많은 시간과 비용이 소요되므로 선택 사항이 아닙니다. 또한 그것은 내 고양이를 죽일 것이고, 그것은 나를 슬프게 할 것입니다.

나는 그에게 기증자로부터 평소 친구를 데려 오는 것에 대해 생각했습니다. ssh가 로드를 시도하고 줄을 자르는 경우에 대비해 작성해 보는 것이 두렵습니다(어차피 바이너리는 사라졌습니다). 이것은 내 고양이 사촌의 직업인 것 같습니다.

root@system:~# netcat -l 1234 > /tmp/less
-bash: netcat: command not found

불행하게도 그는 오래전에 세상을 떠났습니다.

이제 고양이를 속여 그를 부활시키는 의식을 수행하도록 시도해 볼 수 있습니다.

cat > netcat < /dev/tcp/localhost/9999

이것은 실제로 작동합니다. 그는 거의 살아있습니다:

root@system:/tmp# /tmp/netcat
-bash: /tmp/netcat: Permission denied

그에게 필요한 것은 생명의 불꽃뿐입니다. 지금은 외울 수 없는 그 +x작은 마법.

내 고양이 친구를 다시 데려오도록 도와주실 수 있나요?

답변1

현재 상황의 특정 매개변수에 따라 많은 가능성이 있습니다. 아래 예에서는 Linux를 가정하지만 대부분의 경우 다른 플랫폼에도 유사한 기능이 존재합니다.

  • 동적 로더가 실행 파일을 실행하도록 할 수도 있습니다. 동적으로 연결되었다고 가정하면 cat플랫폼에 해당하는 항목 /lib/ld-linux.so.2도 메모리에 있을 수 있으므로 바이너리를 실행하는 데 사용할 수 있습니다.

    $ /lib64/ld-linux-x86-64.so.2 ./chmod
    chmod: missing operand
    

    이들 중 여러 개(아마도 32비트 및 64비트)가 있을 수 있으며, 사용 가능한 복사본이 여러 개 있거나 해결해야 하는 심볼릭 링크가 있을 수 있습니다. 이들 중 하나가 작동할 수 있습니다.

  • vfat 또는 NTFS 파일 시스템이 설치되어 있거나 모든 파일을 777로 처리하는 다른 파일 시스템이 있는 경우 해당 시스템에서 실행 파일을 생성할 수 있습니다.

    $ cat > /mnt/windows/chmod < /dev/tcp/localhost/9999
    
  • 네트워크 파일 시스템을 설치하면 원격 시스템에 파일을 생성해 로컬에서 쓰기가 불가능하더라도 정상적으로 사용할 수 있다.
  • 신경 쓰지 않는 마운트된 파티션의 내용이 여전히 대부분 작동 중인 드라이브에 있는 경우 해당 내용을 원하는 실행 파일이 포함된 동일한 파일 시스템 유형의 새 이미지로 바꿀 수 있습니다. cat이는 사람들에게 작동해야 합니다. 일반적으로 다음을 사용합니다. dd캐릭터, 웹을 통해 이미지를 제공할 수 있습니다.

    $ cat > /dev/sdb1 < ...
    

    이것은 합리적으로 보이지만 파티션의 메모리에 무엇이 남아 있는지에 따라 작동하지 않는 곳이 많이 있습니다.

  • 만약 있다면어느쓰기 가능한 파일 시스템에서 실행 권한이 있는 액세스 가능한 파일로, cat >그 내용을 선택한 바이너리 파일로 바꿀 수 있습니다.

    $ cat > ~/test.py < ...
    
  • Bash가 여전히 실행 중이므로 chmod에 노출된 프로세스에 Bash 플러그인을 동적으로 로드할 수 있습니다. 특히, 다음을 수행할 수 있습니다.설치 및 로드ctypes.sh, Bash에 외부 기능 인터페이스를 제공하는 것, 그리고 dlcall chmod ./netcat 511.
  • foo.so빌드한 동적 라이브러리 파일을 가져온 다음 cat로드하여 LD_PRELOAD임의의 코드를 실행할 수 있습니다.

    $ LD_PRELOAD=./hack.so cat /dev/null
    

    예를 들어 다음을 가로채는 경우 open:

    int open(const char *path, int flags, ...) {
        chmod(path, 0755);
        return -1;
    }
    

    그런 다음 거기에서 필요한 모든 작업을 수행할 수 있습니다.

내 제안은 정적으로 링크된 실행 파일을 첫 번째 프로젝트(또는 실제로는 유일한 프로젝트)로 도입하여 busybox피곤하게 만드는 해킹을 재사용하지 않고도 사용 가능한 모든 명령을 얻을 수 있도록 하는 것입니다.

관련 정보