Замена значений в одном файле со значениями в другом файле в ударе

Ничто неправильно с setuid в TinyCore. Однако простая программа в вопросе не так проста использовать в TinyCore.

system вызов вызывает указанное использование команды /bin/sh -c. В TinyCore, /bin/sh символьная ссылка на busybox ash, который отбрасывает setuid полномочия. Таким образом, даже если Вы создаете сценарий оболочки или даже двоичный файл, который делает что-то злонамеренное и называет его date для обманывания уязвимой программы для выполнения его он не будет работать как setuid. Исходная программа будет работать setuid, но не команда, порожденная system.

Как примечание стороны, стандарт bash также отбрасывания setuid полномочия при вызове как /bin/sh, начиная с версии 2. Однако уязвимость, описанная в вопросе, может быть продемонстрирована в Debian и его производных, как по-видимому, версия Debian bash не отбрасывает полномочия. (Очевидно, существует серьезное основание для этого, но я не исследовал.)

Наконец, я мог обойти поведение отбрасывания полномочий путем изменения программы на:

int main(int argc, char **argv)
{
  // circumvent busybox ash dropping privileges
  uid_t uid = geteuid();
  setreuid(uid, uid);

  printf("Current time: ");
  fflush(stdout);
  system("date");
  return 0;
}
6
13.02.2019, 08:05
3 ответа
[112996] Для этого можно использовать [113419]awk[113420]:

  • Читается model-list.csv, в котором все модели и их описания хранятся в строково-индексированном массиве (например, [113421]a["Z800"] == "HP Z800 Workstation"[113422]). Затем он считывает данные из списка, заменяя каждую модель строкой описания из массива.

    • Объяснение:
    • -F',|, '[113613] - это устанавливает разделитель полей по регрессному шаблону, в этом случае разделитель полей будет либо одной запятой, либо одной запятой и одним пробелом.
    • NR==FNR{a[$2]=$3}[113615] - NR - это внутренняя переменная awk, которая отслеживает общее количество строк, прочитанных с момента запуска программы. FNR аналогична, но отслеживает количество прочитанных строк текущего файла [113616][113617]. Так что [113618]NR==FNR[113619] - это идиома awk, что означает "если это первый прочитанный файл", и связанное с этим действие - [113620]a[$2]=$3[113621], которая сохраняет значение поля 3 в массиве [113622]a[113623], при этом строковый индекс устанавливается в значение поля 2.
    • NR>FNR{$8=a[$8];print}'[113625] - аналогично предыдущему, но на этот раз работает только с файлами, отличными от тех, которые были прочитаны первыми. Для каждой строки мы используем значение поля 8 в качестве индекса для поиска значения в массиве, а затем переназначаем поле 8 на значение массива. Наконец, выводится вся строка .
  • OFS=',' "$file2" "$file1"[113627] - устанавливает выходной разделитель полей запятой (по умолчанию - пробел), затем считывается в 2 файлах в указанном порядке. [12150]

    9
    27.01.2020, 20:21
    [112978]Некоторые примечания:

    alt text

    Bash - ужасный язык для эмуляции баз данных. Вы уверены, что не можете использовать для этого реляционную базу данных?

    Избегайте [113592]бесполезного использования [113646]cat

    • . Вы можете сделать [113594]grep ",$ModelNo", "$file1"[113595].
    • Вы можете сделать [113596], а IFS=, прочитайте -r _ ModelNo ModelName _[113597], чтобы избежать строк [113598]awk[113599].
    • В Bash вы можете сделать [113600]my_command <<<Переменная"[113601] вместо [113602]echo "$variable" | my_command[113603].
    • Для удобочитаемости следует использовать [113604]$(my_command)[113605] вместо [113606]`my_command`[113607].

    grep -F[113609] будет искать буквенные строки.

    Вы можете проверить код выхода [113610]grep[113611], чтобы посмотреть, не нашел ли он что-нибудь. Это должно быть быстрее, чем проверка размера файла.

    4
    27.01.2020, 20:21
    [113963] В bash, предполагая, что версия bash >= 4, вы можете сделать это очень легко, используя [114449]ассоциативные массивы[114450]:[12149]Caveats:[12150]Это не удастся в 1-ой строке конкретного [114795]List.csv[114796], который вы разместили, потому что [114797] model-list.csv [114798] имеет [114799] Model Name [114800] where [114801] List.csv [114802] имеет [114803] Model [114804]. Это означает, что в первой строке не будет совпадений для [114805]${модели [$модели] }[114806]. Вы можете исправить это либо отредактировав заголовок одного из файлов так, чтобы имена полей были идентичны, либо используя эту версию:[12151]#!/usr/bin/env bash декларировать -A модели в то время как IFS=, читайте -r man val mod; делать models["$val"]="$mod" сделано < <(sed 's/, /,/g' "$1") ## Установите счетчик для удержания номеров строк. c=0; в то время как IFS=',' read -r найдите ip host dom dnam user manu model rest; делать ## Увеличьте номер строки (( c++ )); ## Если это 1-я строка, распечатайте если [ "$c" -eq "1" ]; тогда... printf "%s,%s,%s,%s,%s,%s,%s,%s\n" "$loc" "$ip" "$host" "$dom" \. "$dnam" "$user" "$manu" "$model" "$rest"; иначе printf "%s,%s,%s,%s,%s,%s,%s,%s\n" "$loc" "$ip" "$host" "$dom" \. "$dnam" "$user" "$manu" "${models[$model]}" "Арест"; fi сделано < <(sed 's/, /,/g' "$2") Это предполагает, что ваш файл настолько прост, насколько вы можете судить, что [114809] все поля [114810] определены запятыми, и что ни одно из полей не может содержать запятых. [12153]В Perl это, конечно, можно сделать гораздо проще:[12154]Explanation[12155]-F[114656] устанавливает разделитель полей (здесь [114657],[114658], за которым следуют 0 или более пробельных символов), который используется с [114659]-a[114660], который автоматически разделяет каждую входную строку на массив [114661]@F[114662]. [12156]-l[114664] включает автоматическое удаление [114665]-a[114666] в конце каждой строки, а также добавляет неявное [114667]-a[114668] к каждому оператору [114669]-a[114670]. [12157]-n[114672] означает чтение входного файла построчно и применение к нему любого скрипта, переданного с помощью [114673]-e[114674].[12158]$k{$F[1]}=$F[2][114676] : заполняется значение имеет [114677]%k[114678], где 2-е поле каждой строки является ключевым, а значение - 3-е поле. Это относится только к [114679]model-list.csv[114680], но также будет использовано для [114681]List.csv[114682]. Это можно смело игнорировать до тех пор, пока [114683]List.csv[114684] никогда не будет содержать 8-го поля, которое также присутствует в качестве 2-го поля в [114685]model-list.csv[12159]next if $#F < 4[114688] : прочтите следующую строку, если в этой строке меньше 4 полей. Это необходимо для того, чтобы окончательная печать [114689]-[114690] не вывела строки [114691] model-list.csv[12160]s/$F[7]/$k{$F[7]}/; выведите[114694] : замените 8-ое поле текущей строки на то, что хранится в хэше [114695]%k[114696] для этого поля, и выведите эту строку. [12161]
    3
    27.01.2020, 20:21

    Теги

    Похожие вопросы