I've read what a Turing machine and a UTM are, but I don't get the difference. What can a UTM do which a normal Turing machine can not?
A universal Turing machine is just a Turing machine whose programming simulates other Turing machines. That is, the input to the UTM is a description of a Turing machine $T$ and an input for $T$, and the UTM simulates $T$ on that input.
It's universal in the sense that, for any problem that can be solved by Turing machines, you could either use a Turing machine that directly solves that problem, or you could use a UTM and give it the description of a TM that directly solves the problem.
If you like, a UTM is an interpreter for (all) Turing machines.
A UTM can run any Turing machine on some input.
A Turing machine can be compared to a program. It takes some input and generates some output.
A UTM can be compared to a computer. It can take any program and run it with some input and generates some output.
The UTM is a Turing machine in itself, so the interesting idea here is that any Turing machine can be encoded as input understood by another Turing machine.
Every TM does just one task. It sums two input numbers, or it scans the input for some symbol, or it looks for a counterexample of Goldbach's conjecture ...
... or it (let us call it TM#1, since we will have a 2nd one shortly) gets two parts of input, where the first describes a TM, TM#2 (think of a (fixed) TM as a finite number of states and transitions and stuff like head directions) and next to the description of TM#2 a description of input to TM#2.
So TM#1 receives the pair ("TM#2" "input#2") as its input#1. And then TM#1 runs on this input#1 and behaves (to the outside, after termination!) as if it was TM#2 working on input#2. In case TM#2 would not halt, TM#1 won't do either.
Such a TM#1 is called a UTM, since it can behave like/fake/simulate any other TM you give it as TM#2. Think of a virtual machine (TM#1), a simulated program (TM#2), and an input to the simulation (input#2). The VM takes longer, but the results are the same.
Even TM#2 = TM#1 is possible ... then input#2 = ("TM#3" "input#3") and TM#1 is a UTM and now simulates another UTM (TM#2) which in turn meta-behaves as TM#3 on input#3, in symbols:
TM#3(input#3) = TM#2("TM#3 input#3") since we took TM#2 to also be a UTM = TM#1("TM#2 'TM#3 input#3'")
Again: Behaviour is in terms of eventual final output, if and when halting, certainly not in terms of tape contents at any time, number of time steps etc., simulation takes (much) more time than doing it directly.